Я новичок в Hibernate и JPA и в настоящее время работаю над приложением, которое использует его через EntityManager JPA.
Глядя на некоторые базовые руководства по спящему режиму с использованием сеанса гибернации, я вижу, что могу сделать:
val session = HibernateUtil.getSessionFactory().getCurrentSession()
session.beginTransaction()
val coordinates = session.find(Coordinates::class.java, "12345")
coordinates.longitude = 0.0
session.save(coordinates)
session.getTransaction().commit()
При использовании Entitymanager это делается так:
val em = emFactory.createEntityManager()
em.transaction.begin()
val coordinates = em.find(Coordinates::class.java, "12345")
coordinates.longitude = 0.0
em.transaction.commit()
Основное отличие здесь в том, что при использовании EntityManager мне не нужно явно вызывать функцию save для фактического обновления объекта, который в конечном итоге будет сброшен во время фиксации. Конечно, я мог бы сделать что-то вроде
if(obj.id == null) {
return em.merge()
} else {
val saved = em.persist(obj)
return saved
}
Но какой смысл в уже существующих объектах, если они все равно сохраняются, независимо от того, вызываю я это или нет?
Удивительно, но примеры можно найти здесь похоже, также полагаются на метод сохранения.
Мой вопрос: есть ли способ настроить EntityManager для обновления объектов только по запросу (т.е. имитировать поведение сеанса)? Или мне нужно использовать Session для достижения этого?
mergeна EM можно использовать, например, для e. грамм. повторно присоединять объекты к сеансу без необходимости перезагрузки объекта и заполнения полей на основе отсоединенного объекта. - person Smutje   schedule 29.05.2020@ApplicationException(rollback=true), который, как предполагает его параметр, вызывает откат транзакции. - person Smutje   schedule 29.05.2020