0

我正在开发一个使用 jpa 将数据保存到数据库的 java se 项目。

现在我为每个数据库操作获得一个新的实体管理器,并在函数调用结束时关闭它。喜欢

public void save(T entity){
  em = getNewEntity();
  em.persisty(entity);
  em.close;
}

但是管理多对多关系非常困难。例如,
我有一个与 B 实体有多对多关系的实体。他们有 CascadeType.MERGE。

一旦我创建 A,我创建 B,并运行多个线程来为 A 和 B 生成信息。但有时 B 会保持 A 的过时,如果我合并 B,那么 A 的数据将被清除。

例如 。A 是音乐,B 是音乐专辑,所以一个 B 会有一个 A 列表。另一个线程将读取音乐元数据并获取音乐标签信息并更新 A ,当在 FS 中找到新的 A 时,B 将被更新。
由于实体管理器关闭,B 的 A 列表中的实体已过期,这意味着当 A 更新自身时,B 不知道 A 更新了。一旦合并 B ,jpa 将帮助我们使用 B 的 A 列表中的实体合并 A。

为了解决这个问题,我决定使用一个实体管理器并将所有数据库操作放在一个线程中。然后新的问题就出来了。

当交易处于活动状态并且交易应该为实体之间打开时

transaction.begin();
....
transaction.end();

但是有很多线程正在运行,这些线程也可能会改变实体。

我的问题是:如何在 java se 开发中使用 jpa ?谢谢

4

1 回答 1

0

如果关系不同步,你不能责怪 JPA。应用程序有责任保持关系正常。

在 JPA 中,就像在 Java 中一般,维护关系是应用程序或对象模型的责任。

资源

正如@home 所说,您需要正确同步。

话虽如此,EntityManager 不是线程安全的,因此您需要以某种方式解决此问题。同步您的应用程序,每个线程使用一个 EntityManager,使用 @PersistenceContext 等。

编辑:是一个关于同步访问 EntityManager 的问题。我想它可能对你有用。

于 2012-06-10T17:22:44.130 回答