繁体   English   中英

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

[英]jpa : how to use jpa in java se development

我正在使用java的java se项目进行工作,以使用数据库持久化数据。

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

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

但是很难处理多对多关系。 例如
我有一个与B实体有多对多关系的A实体。 他们有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? 谢谢

如果关系不同步,则不能责怪JPA。 保持关系理智是应用程序的责任。

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

资源

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

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

编辑: 是一个有关同步访问EntityManager的问题。 我认为这可能对您有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM