我与链接表中的附加列存在多对多关系。我已经将它配置为拥有方让孩子们渴望(所以我没有得到LazyInitializationException
),而在相反的方向它是懒惰的。这行得通。
我现在想微调事务(在@Transactional
DAO 和服务类的类级别之前。我将方法设置getById
为readOnly = true
:
@Transactional(readOnly = true)
public Compound getById(Long id) {
return compoundDAO.getById(id);
}
在此更改之后,我得到LazyInitializationException
以下代码段:
Compound compound = compoundService.getById(6L);
Structure structure = compound.getComposition().get(0).getStructure();
System.out.println("StructureId: "+ structure.getId()); // LazyInitializationException
如果我删除(readOnly = true)
这个作品!谁能解释这种行为?我使用 Spring + Hibernate。有点令人困惑,因为我看不出这会影响加载哪些数据的任何原因?
编辑:
关系定义的片段。这是在链接表中具有一列的多对多。
拥有方(例如 Compound 包含结构):
@OneToMany(fetch = FetchType.EAGER, mappedBy = "pk.compound",
cascade = CascadeType.ALL, orphanRemoval = true)
@OrderBy("pk.structure.id ASC")
private List<CompoundComposition> composition = new ArrayList<>();
属于方:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.structure",
cascade = CascadeType.ALL)
@OrderBy("pk.compound.id ASC")
private List<CompoundComposition> occurence;
@Embeddable ID 类中的多对一
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Compound getCompound() {
return compound;
}
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Structure getStructure() {
return structure;
}
编辑2:
堆栈跟踪
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:272) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) ~[hibernate-core-4.1.7.Final.jar:4.1.7.Final]
at org.bitbucket.myName.myApp.entity.Structure_$$_javassist_0.getId(Structure_$$_javassist_0.java) ~[classes/:na]
at org.bitbucket.myName.myApp.App.main(App.java:31) ~[classes/:na]
编辑 3:
另见我的评论:
日志与 readOnly 非常不同,它缺少加载关系的部分,例如。日志中缺少一些选择。
编辑4:
所以我厌倦了基本的 DriverManagerDataSource 和没有连接池。问题完全一样。对我来说,这看起来像是 Hibernate 中的一个问题。