IBM 建议使用 EntityManagers 的最佳实践是获取/使用/关闭。如果 EntityManager 没有关闭,那么同一个 EntityManager 可能会被多个线程使用,这将导致以下错误:
<openjpa-2.1.2-SNAPSHOT-r422266:1179900 fatal general error> org.apache.openjpa.persistence.PersistenceException: Multiple concurrent threads attempted to access a single broker. By default brokers are not thread safe; if you require and/or intend a broker to be accessed by more than one thread, set the openjpa.Multithreaded property to true to override the default behavior.
如果您加载一个将 OneToMany 集合映射为 fetch=LAZY 的对象,如下所示:
public T find(Object id) {
T t = null;
EntityManager em = getEm();
t = em.find(type, id);
em.close();
return t;
}
EntityManager getEm() {
if(this.em ==null || !this.em.isOpen()) {
this.em = emf.createEntityManager();
}
return this.em;
}
集合将始终为 null,因为当有人调用 getter 时,EntityManager 已关闭。仅当 fetch 为 EAGER 时才加载集合,但这会导致每次 SQL 连接都很慢。
所以它要么是“多线程”错误,要么是 openjpa.Multithreaded=true 这是一个不好的做法,或者它很慢,因为即使不需要集合,每次都需要 SQL 连接。有什么方法可以正确地做到这一点,所以它既可以通过 Lazy fetch 快速获取,又可以仅使用最佳实践来完成?