4

我目前正在桌面应用程序中试验 JPA,同时使用 BeansBinding 来简化 GUI 开发。到目前为止,结果相当不错。

作为示例应用程序,我有一个只有一个表的小型数据库。我成功地创建了实体,PU。接下来,我将 JTable 放入主 JFrame 并将其列绑定到 JPA 查询。这就像一个魅力。因此,对实体所做的更改会反映在表中,反之亦然。

接下来我想让表格可编辑,以便将更改保存到数据库中。我想出的最简单的方法是开始查询并立即提交。因此,假设我在某处有一个 JButton,请在以下位置执行以下操作actionPerformed

private void saveClicked(java.awt.event.ActionEvent evt) {
    this.myEntityManager.getTransaction().begin();
    this.myEntityManager.getTransaction().commit();
}

这很有效,但对我来说看起来很奇怪。我也尝试在windowClosing. 随着成功。

但是为什么这行得通?我的意思是,交易begincommit. 更重要的是,这样做可以吗?

4

1 回答 1

2

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

扩展了应用程序管理的实体管理器的持久性上下文的范围。管理持久化上下文的生命周期是应用程序的责任。

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

于 2010-02-20T09:53:49.470 回答