Сохранение данных при использовании JPA и BeansBinding
В настоящее время я экспериментирую с JPA в настольном приложении, используя BeansBinding, чтобы упростить разработку GUI. Пока что результаты довольно хорошие.
В качестве примера приложения у меня есть небольшая БД только с одной таблицей. Я успешно создал сущность, ПУ. Затем я поместил JTable в основной JFrame и связал его столбцы с запросом JPA. Это работает как шарм. Таким образом, изменения, внесенные в сущности, отражаются в таблице и наоборот.
Затем я хотел сделать таблицу редактируемой, чтобы изменения сохранялись в БД. Самый простой способ, которым я придумал, - это начать запрос и немедленно его зафиксировать. Итак, предполагая, что у меня где-то был JButton, сделайте следующее на actionPerformed
:
private void saveClicked(java.awt.event.ActionEvent evt) {
this.myEntityManager.getTransaction().begin();
this.myEntityManager.getTransaction().commit();
}
Это работает отлично, но выглядит странно неправильно для меня. Я также пытался сделать это на windowClosing
, С успехом.
Но почему это работает? Я имею в виду, что нет никакого кода между транзакцией begin
а также commit
, И что более важно, нормально ли это делать?
1 ответ
Такое несколько ошибочное поведение, когда менеджер сущностей сохраняет незафиксированные изменения без явного уведомления, возникает из-за того, что менеджеры сущностей, управляемые приложением, всегда расширяются. Спецификация JPA (в разделе 3.3) гласит:
Область контекста персистентности менеджера сущностей, управляемого приложением, расширена. Приложение отвечает за управление жизненным циклом контекста персистентности.
Поэтому, когда рассматриваемый бин уже находится в контексте постоянства, и вы выполняете транзакции .mit, любые незафиксированные изменения будут сохраняться даже без явного entitymanager.persist. Вы можете проверить это поведение для себя, очистив entitymanager (entitymanager.clear) перед совершением транзакции. Это удалит сущность из tx-commit и приведет к тому, что транзакция не выполнит никаких изменений в базе данных.