gpt4 book ai didi

java - 为每个实体使用单独的实体管理工厂是否会导致问题?

转载 作者:行者123 更新时间:2023-12-01 09:31:02 26 4
gpt4 key购买 nike

我已经为每个实体类型创建了一个存储库类(处理所有 jpa 方法的类),并拥有自己的实体管理工厂。现在我在多对多关系中遇到了以下错误:

验证异常
[junit][EclipseLink-7251] 异常描述:类 [Person] 的属性 [ID] 映射到数据库中的主键列。不允许更新。

在调试时,此错误通常不会再出现,并且似乎不一致,这使我相信这可能是管理器之间的同步问题。 (Pk 由 jpa 处理 - @Id @GenerateValue - 我从未更改过,但我确实使用级联合并)

我目前的假设是否正确,即拥有多个实体管理工厂是一个坏主意(并且可能与我的问题有关)?

最佳答案

EntityManagerFactory 代表一个持久单元,或者换句话说,一个数据源。如果您没有多个数据源,则不应创建多个 EMF。不过,您可以创建多个 EntityManager(您可以将其视为数据库的“连接”)。

你可以像这样创建 EMF -

EntityManagerFactory emf = Persistence.createEntityManagerFactory(
"objectdb://localhost/myDbFile.odb;user=admin;password=admin")

 EntityManagerFactory emf =
Persistence.createEntityManagerFactory("myDbFile.odb");

然后你像这样创建 EntityManager -

 EntityManager em = emf.createEntityManager();

来自 Javadoc - http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html

Interface used to interact with the entity manager factory for the persistence unit.When the application has finished using the entity manager factory, and/or at application shutdown, the application should close the entity manager factory. Once an EntityManagerFactory has been closed, all its entity managers are considered to be in the closed state.

添加更多内容,您可能还需要像这样创建的事务 -

try {
em.getTransaction().begin();
// Operations that modify the database should come here.
em.getTransaction().commit();
}
finally {
if (em.getTransaction().isActive())
em.getTransaction().rollback();
}

关于java - 为每个实体使用单独的实体管理工厂是否会导致问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com