java - 使用 JPA 和 BeansBinding 时保存数据

标签 java swing jpa desktop beans-binding

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

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

接下来,我想让表可编辑,这样更改就会持久保存到数据库中。我想到的最简单的方法是开始查询并立即提交。所以,假设我在某处有一个 JButton,在 actionPerformed 上执行以下操作:

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

这很好用,但对我来说却奇怪地错了。我还尝试在 windowClosing 上执行此操作。成功了。

但为什么这有效?我的意思是,在事务 begincommit 之间没有任何代码。更重要的是,可以吗?做这个?

最佳答案

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

The scope of the persistence context of an application-managed entity manager is extended. It is the responsibility of the application to manage the lifecycle of the persistence context.

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

关于java - 使用 JPA 和 BeansBinding 时保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2261400/

相关文章:

java - 避免tomcat/spring-boot中慢客户端导致的线程饥饿

java - 不知道如何使用 SetBorder

java - 组件及其内容上的 Swing 弹出菜单

java - 如何用硬编码值替换@JoinColumn?

java - Android SDK 不会从 Eclipse 启动

java - 在 JScrollPane 中看不到组件

java - 仅给出与 JMenuItem 关联的字符串,是否可以从 JMenu 中删除 JMenuItem

java - 如何仅获取与 JPA 中其他 2 个表具有 @OneToMany 关系的父记录

带有 SQL Server 的 Java JPA/Hibernate - 如何检测数据库中的列何时未被实体模型映射?

java - 如何编写连接到本地文件以发送和接收数据包的客户端套接字流