Spring PersistanceContext, EntityManager и работа с вашей базой данных

Я работал над некоторыми базовыми веб-приложениями Spring, и у меня возникли проблемы с правильным управлением моей базой данных. С тех пор я использую базовые репозитории JPA, и классические save() и findById(long id) выполняют свою работу за меня. Однако недавно я заметил, что когда я получаю объект из базы данных и изменяю его, он не сохраняется. Это привело меня к поиску в Google обо всем, что указано в заголовке вопроса. То, что я нашел, действительно смутило меня, поэтому, возможно, кто-то может прояснить это для меня:

  • Я заметил, что некоторые люди используют сеанс (из постоянства) и некоторые используют EntityManager. Почему?
  • Некоторые люди говорят, что вы ДОЛЖНЫ внедрить EntityManagerFactory и получить оттуда EntityManager, правда ли это и почему?
    • Я не смог сделать это должным образом, следуя одному или двум руководствам, кто-нибудь еще хочет дать мне объяснение, как это сделать?
    • я видел, что EntityManagerFactory вводится тысячей разных способов (довольно запутанно), что было бы лучше?
  • Я видел это Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); это дало мне entityManager для работы, но у меня были ошибки, и люди говорили об этом: With regards to the original question about obtaining an EntityManagerFactory in a non-spring setting. You simply call Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);, что бы это была за настройка без весны?
  • Есть ли разница, если я работаю над разработкой в ​​простой базе данных H2 или в базе данных mysql?
    • Ссылка на хороший и актуальный учебник или рекомендацию книги, которая охватывает это, я изучаю это в классе, и они никогда ничего не упоминали о контексте сохранения и управлении сущностями, поэтому я совершенно запутался.
spring.io/guides/gs/accessing-data-jpa
JB Nizet 24.02.2019 18:24
недавно я заметил, что когда я получаю объект из базы данных и изменяю его, он не сохраняется: это произойдет только в том случае, если вы сделаете это из транзакционного метода. Если вы этого не сделаете, то объект, который вы загружаете, становится неуправляемым (отсоединенным), как только метод репозитория возвращается.
JB Nizet 24.02.2019 18:26

Все это, кажется, вещи, которые я уже знаю, как делать. Меня интересует entityManager, а также манипулирование и сохранение объектов в базе данных. или по вашей ссылке есть еще одна глава, которую я просто не могу найти?

Emperor 24.02.2019 18:27

Если вам действительно нужно получить EntityManager внутри приложения Spring, просто внедрите его с помощью @PersistenceContext EntityManager entityManager. docs.spring.io/spring/docs/current/spring-framework-referenc‌​e/…

JB Nizet 24.02.2019 18:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Существует четыре способа использования Spring DAO:

  • Поддержка JdbcTemplate + Spring DAO (вы будете использовать класс JdbcTemplate)
  • Поддержка Hibernate+ Spring DAO (вы будете использовать класс SessionFactory)
  • Поддержка JPA + spring DAO (вы будете использовать класс EntityManager)
  • JPA + Spring Data (абстракция высокого уровня для DAO)

JDBC, Hibernate, JPA — это независимые технологии. Если вы научитесь hibernate, вы научитесь использовать SessionFactory. То же самое для jpa и EntityManager. Весенние данные — еще одна абстракция от Spring для доступа к базе данных.

Для получения дополнительной информации о поддержке весеннего DAO, пожалуйста, ознакомьтесь с документацией здесь.

Я работаю с репозиториями JPA, а Hibernate выполняет сопоставление с базой данных, так какую технологию я использую?

Emperor 24.02.2019 18:46

Если вы используете интерфейсы репозиториев JPA, вы используете Spring Data. Тогда вам не нужно напрямую использовать EntityManager или SessionFactory.

Andrianekena Moise 24.02.2019 18:50

Тогда как мне решить эту проблему? personRepository.save(someguy) personRepository.findById("1").setName("BlaBla") Другое имя не сохраняется. Я знаю, что могу сделать Person temp=personRepository.findById("1"); temp.setName("BlaBla") personRepository.save(temp); Но не плохо ли экономить дважды? Кроме того, я не буду вдаваться в другие проблемы, не зная, как манипулировать сущностями?

Emperor 24.02.2019 18:54

Вы вызвали метод CrudRepository.save(person) для его сохранения? Это способ сохранить сущность, если вы используете данные Spring.

Andrianekena Moise 24.02.2019 18:58

Да, но тогда, если в методе я хочу изменить его имя, после того, как я его получу и изменю, должен ли я снова сохранить? это не плохо? Знает ли он, что это та же самая сущность, которую я взял, чтобы я мог изменить ее?

Emperor 24.02.2019 19:02

Данные Spring будут знать, что ваша сущность является управляемой. Метод сохранения сохраняет или объединяет данный объект с помощью JPA EntityManager.

Andrianekena Moise 24.02.2019 19:07

Пожалуйста, прочитайте документацию по весенним данным для получения дополнительной информации.

Andrianekena Moise 24.02.2019 19:08

Пожалуйста. Если было полезно, отметьте как ответ. Спасибо

Andrianekena Moise 24.02.2019 19:11

Я хочу оставить это еще на час или два, после этого я дам вам ответ :) еще раз спасибо!!

Emperor 24.02.2019 19:13

Другие вопросы по теме