使用JPA和BeansBinding时保存数据

时间:2010-02-14 14:29:31

标签: java swing jpa desktop beans-binding

我目前正在桌面应用程序中试用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上执行此操作。成功。

但为什么这有效呢?我的意思是,交易begincommit之间没有任何代码。更重要的是,是O.K.这样做?

1 个答案:

答案 0 :(得分:2)

这种有点不稳定的行为,其中 entitymanager 在没有明确告知的情况下持续存在未提交的更改,因为应用程序管理的实体管理器总是被扩展。 JPA规范(第3.3节)说:

  

持久化上下文的范围   应用程序管理的实体   经理延长了。它是   申请责任   管理的生命周期   持久化背景。

因此,当有问题的bean已经处于持久性上下文并执行 transaction.commit 时,即使没有明确的 entitymanager.persist ,任何未提交的更改也会被保留。您可以在提交事务之前清除entitymanager( entitymanager.clear )来自行验证此行为。这将从tx-commit中删除实体,并将导致事务不对数据库执行任何更改。