我有一个模型如下的项目(伪代码):
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,没有 session 或 session 已关闭
如果我将 ClientVersion 和 Client 之间关系的 FetchType 更改为 EAGER,它会起作用,但我当然更喜欢延迟加载它。
我知道如果我有权访问 hibernate session ,我可以手动初始化集合,但是有什么方法可以映射它以便 Hibernate 可以自己完成它吗?当我想要获取一些相关对象时,我不想使用我的自定义方法。
最佳答案
使用FetchType.LAZY
,您可以按需加载数据。但是,如果超出 session 范围,则无法加载它们,因为 session 已经关闭。
使用FetchType.EAGER
,您可以一次性加载所有数据在数据库中执行联接,因此不会出现异常,因为当您超出 session 范围时,数据已经加载,您不需要从数据库中提取它们
关于java - Hibernate 嵌套延迟加载和 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511381/