我目前正在桌面应用程序中试用JPA,同时使用BeansBinding使GUI开发更容易。到目前为止,结果非常好。
作为一个示例应用程序,我有一个只有一个表的小DB。我成功创建了实体PU。接下来,我将JTable放入主JFrame并将其列绑定到JPA查询。这就像一个魅力。因此,对实体所做的更改反映在表中,反之亦然。
接下来,我想让表格可编辑,以便将更改保留在数据库中。我想出的最简单的方法是开始一个查询并立即提交它。所以,假设我在某个地方有一个JButton,请在actionPerformed
上执行以下操作:
private void saveClicked(java.awt.event.ActionEvent evt) {
this.myEntityManager.getTransaction().begin();
this.myEntityManager.getTransaction().commit();
}
这很有效,但对我来说这看起来很奇怪。我也尝试在windowClosing
上执行此操作。成功。
但为什么这有效呢?我的意思是,交易begin
和commit
之间没有任何代码。更重要的是,是O.K.这样做?
答案 0 :(得分:2)
这种有点不稳定的行为,其中 entitymanager 在没有明确告知的情况下持续存在未提交的更改,因为应用程序管理的实体管理器总是被扩展。 JPA规范(第3.3节)说:
持久化上下文的范围 应用程序管理的实体 经理延长了。它是 申请责任 管理的生命周期 持久化背景。
因此,当有问题的bean已经处于持久性上下文并执行 transaction.commit 时,即使没有明确的 entitymanager.persist ,任何未提交的更改也会被保留。您可以在提交事务之前清除entitymanager( entitymanager.clear )来自行验证此行为。这将从tx-commit中删除实体,并将导致事务不对数据库执行任何更改。