Сохранение данных при использовании JPA и BeansBinding - PullRequest
4 голосов
/ 14 февраля 2010

В настоящее время я экспериментирую с JPA в настольном приложении, одновременно используя BeansBinding, чтобы упростить разработку графического интерфейса. Пока что результаты неплохие.

В качестве примера приложения у меня есть небольшая БД с одной таблицей. Я успешно создал сущность, ПУ. Затем я поместил 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 Ответ

2 голосов
/ 20 февраля 2010

Такое несколько ошибочное поведение, когда entitymanager сохраняет незафиксированные изменения без явного уведомления, возникает из-за того, что менеджеры сущностей, управляемые приложением, всегда расширяются. Спецификация JPA (в разделе 3.3) гласит:

Область действия персистентного контекста объекта, управляемого приложением менеджер продлен. Это ответственность приложения к управлять жизненным циклом контекст постоянства.

Таким образом, когда рассматриваемый компонент уже находится в контексте постоянства и вы выполняете транзакции транзакции , любые незафиксированные изменения будут сохраняться даже без явного entitymanager.persist . Вы можете проверить это поведение для себя, очистив entitymanager ( entitymanager.clear ) перед совершением транзакции. Это удалит сущность из tx-commit и заставит транзакцию не выполнять никаких изменений в базе данных.

...