我有一个类似下面的模型项目(伪代码):
class Transaction{
@OneToMany(mappedBy="transaction", fetch = FetchType.LAZY)
private Set<TransactionVersion> transactionVersions;
}
class TransactionVersion{
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="ID_TRANSACTION_VERSION")
private Transaction transaction;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="ID_CLIENT_VERSION")
private ClientVersion clientVersion;
}
class ClientVersion{
@OneToMany(mappedBy="clientVersion",fetch=FetchType.Lazy)
private Set<TransactionVersion> transactionVersions;
@OneToMany(mappedBy="client", fetch=FetchType.LAZY)
private Set<Client> clients;
}
现在,如果我尝试得到这样的东西(get(0)只是一个例子):
transaction.getTransactionVersions().get(0)
.getClientVersion().getClients()
我得到LazyInitializationException无法懒惰地初始化角色集合:ClientVersion.clients,没有关闭会话或会话
如果我将ClientVersion和Client之间的关系上的FetchType更改为EAGER,它可以正常工作,但我当然更喜欢懒惰地加载它。
我知道如果我可以访问hibernate会话,我可以手动初始化集合但是有没有办法映射它以便Hibernate可以自己做呢?当我想获得一些相关的对象时,我不想使用我的自定义方法。
答案 0 :(得分:2)
使用 FetchType.LAZY
,按需加载数据。但是,如果您超出会话范围,则无法加载它们,因为会话已经关闭。
使用 FetchType.EAGER
,您一次加载所有数据在数据库中执行连接,因此您没有例外,因为当您超出会话范围的数据已经加载,您无需从数据库中提取数据