jpa:如何在java se开发中使用jpa

时间:2012-06-10 04:21:32

标签: java jpa entitymanager

我正在开发一个使用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,B将在FS中找到新的A时更新 由于实体经理关闭,B列表中的实体已过时,这意味着当A更新本身时,B不知道A已更新。一旦合并B,jpa将帮助我们使用B&A的A列表中的实体合并A.

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

当事务处于活动状态且事务应该在

之间为实体打开时
transaction.begin();
....
transaction.end();

然而,有许多线程正在运行,这些线程也可能改变实体。

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

1 个答案:

答案 0 :(得分:0)

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

  

在JPA中,与Java一样,应用程序或对象模型负责维护关系。

Source

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

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

编辑:Here是一个有关同步访问EntityManager的问题。我认为它对你有用。