java - 如何在Java SE应用程序中管理两个持久单元

标签 java jpa eclipselink

我们开发了一个可在两个持久性单元上运行的应用程序。应用程序从一个 PU1 检索实体并在循环中处理它们。

在此循环中,它更新 PU2 的记录,最后更新 PU1 实体并将它们标记为已处理。

它工作正常,但问题是我必须为 PU1 实体的每次遍历开始/提交 PU2,因此我们面临性能问题。

try{
em1.getTransaction.begin();
Query query = em1.createNamedQuery("Request.SELECT_ALL");
query.setMaxResults(1000);
List<LoaneeRefill> requests = query.getResultList();

for (Request vo : requests) {

 em2.getTransaction.begin();

 Response r =new Resopnse();
 r.setNumber(vo.getNumber);

 em2.persist(r);

 em2.getTransaction.commit();

 vo.setStatus("Y");
 em1.merge(vo);
 }


 em1.getTransaction.commit();
 }catch(Exception e){}

上述代码会导致性能问题/在处理大量请求时花费大量时间。

我尝试了以下代码,但出现错误:

 try{
 em1.getTransaction.begin();
 em2.getTransaction.begin();

 Query query = em1.createNamedQuery("Request.SELECT_ALL");
 query.setMaxResults(1000);
 List<LoaneeRefill> requests = query.getResultList();

 for (Request vo : requests) {

 Response r =new Resopnse();
 r.setNumber(vo.getNumber);

 em2.persist(r);

 vo.setStatus("Y");
 em1.merge(vo);
 }


 em2.getTransaction.commit();
 em1.getTransaction.commit();
 }catch(Exception e){}

错误:

javax.persistence.PersistenceException: Exception [EclipseLink-7197] (Eclipse Persistence Servi
ces - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Null or zero primary key encountered in unit of work clone

编辑:

如果我从 PU1 获取实体列表并将它们分离,有什么建议吗?然后处理这些请求并通过一次更新或任何其他方式更新列表。

最佳答案

这取决于您如何在数据库中生成 ID。如果它们是通过数据库自动增量生成的,那么下面的信息可能是您获得更好性能的唯一选择。

如果您有其他 ID 系统,或者可以更改 ID 的生成方式,请查看 here了解有关如何使用表或序列生成 ID 以及这两个系统的优点和缺陷的更多信息。

<小时/>

在 for 循环末尾,尝试添加...

em2.flush();

原因是 JPA 并未实际将更改提交到提交行的数据库单元。因此,ID 尚未设置。 (我认为它在占位符处添加了 0),当您尝试保留第二个项目而不提交第一个项目时,它最终会得到具有相同占位符 id 的第二个记录。

刷新将实际执行 SQL,以实际将记录添加到数据库并获取创建的真实 ID,但保持事务打开,因此您应该会看到性能提升。

看来持久性 API 应该足够智能,可以同时处理多个新记录,但这不是我的经验,可能有一个很好的理由,但我不知道它是什么。

<小时/>

关于java - 如何在Java SE应用程序中管理两个持久单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11427436/

相关文章:

Java 不会自动包含类

jpa - 未设置必需的Derby DataSource属性databaseName

java - Spring Data JPA/Hibernate - @Repository 中的 findByY(String y) 方法,其中 Y 可通过对象 X 访问

java - CXF WebSocket 配置

java - 游戏引擎中 JFrame 的图形问题

java - JPA 实体从 Hibernate 到 EclipseLink

java - 使用 EclipseLink 在 @MappedSuperclass 基类上使用 @ElementCollection 和 @CollectionTable

java - JPA 查询 - 如何混合任意查询字符串和 CriteriaBuilder

java - hibernate 。如何将自己的类映射为实体中的属性类型?

Hibernate:如何使用注释指定自定义序列生成器类名?