我有一个具有以下表的旧数据库:
Police
id (PK)
data...
Contract
id(PK)
version(PK)
type
Code
tab(PK)
code(PK)
name
我有一个JPA实体警察
@Entity
public class Police implements Serializable {
@Id
private long id
@OneToMany(fetch = FetchType.LAZY)
@JoinColumns(value = { @JoinColumn(name = "id", referencedColumnName = "id") })
private Set<Contract> contracts;
}
合同实体看起来像这样:
@Entity
public class Contract implements Serializable {
@Id
private long id;
@Id
private long version;
private String type;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "code", referencedColumnName = "type") })
@Where(clause = "tab = 'Type'")
private Set<Code> type;
}
码:
@Entity
public class Code implements Serializable {
@Id
private String tab;
@Id
private String code;
private String name;
}
在代码表中,有许多用于不同应用程序的不同键/值。
在我的情况下,我需要一个,其中“ tab ='Type'”和代码=我合同中的类型。
我的问题是,如果我与警察有多个合同,我会随意吗?获取org.hibernate.LazyInitializationException。
在我的测试用例中,我执行以下操作:
public static void main(String[] args) {
int countErrors = 0;
for (int i = 0; i < 15; i++) {
try {
readPolice();
} catch (Exception e) {
e.printStackTrace();
countErrors++;
}
}
System.err.println("errors: " + countErrors);
}
private static void readPolice() throws Exception {
EntityManagerFactory factory = EntityManagerFactoryHelper.getFactory(PersistenceUnitsEnum.TEST_STAGE);
EntityManager em = factory.createEntityManager();
TypedQuery<Police> namedQuery = em.createNamedQuery(...);
Police result = namedQuery.getSingleResult();
Set<Contract> contracts = result.getContract();
Contract contract = contracts.iterator().next();
Set<Code> type = contract.getType(); //should be a set with one Entry
System.out.println(type.size()); //<--- Chance for Exception!!
em.close();
}
我将整个过程循环尝试15次。
在大约5-8次尝试中,我得到了LazyInitializationException。
其他时间它起作用。
有什么想法吗?为什么它不会一直失败?
最佳答案
刚遇到这个。关键字是“随机”。我的一位同事在她的笔记本电脑上始终遇到这种异常,而我从未遇到过。她只能在IE&Edge上重现异常。
最终意识到它与Tomcat版本有关。她运行的是旧版本,而我的运行是8.5.8。她将本地Tomcat升级到此版本,并且不再遇到例外。