JPA EntityManager: сохранять объекты только при явном запросе - PullRequest
0 голосов
/ 29 мая 2020
• 1000 Я могу:
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 для обновления объектов только по запросу (т.е. имитировать поведение сеанса) ? Или мне нужно использовать сеанс для этого?

1 Ответ

1 голос
/ 29 мая 2020

merge - это возможность EntityManager фактически выполнять операции с базой данных. Слияние, сохранение, сброс и фиксация - это, по сути, все точки контакта с базой данных.

В простых случаях вы можете просто полагаться на изменение поведения при фиксации, а не на физическое слияние, но многим нравится элемент управления, зная, когда это действительно произойдет. Зная, что «после этого он находится в БД». Потому что после слияния сохраняются не только данные вместе с любым каскадным поведением, но и любые побочные эффекты от триггеров et c. в БД тоже произошли.

Они не зафиксированы, но они произошли. Ключи назначаются для родителей и детей, сработали триггеры, сработали методы жизненного цикла, все работает «как должно быть», «прямо сейчас», а не «когда-нибудь в будущем», даже если это может быть всего в миллисекундах.

...