我有一个包含以下表格的旧数据库:
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'”和代码=我的契约(Contract)中的类型。
我的问题是,如果我的警察有不止一份契约(Contract),我是随机的吗?获取 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升级到此版本,不再遇到异常。
关于java - 带有 @OneToMany 的随机 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29077392/