无法延迟获取 - @Transactional 方法中没有会话
Cannot lazy fetch - no session inside @Transactional method
基本上,我试图获得一个与另一个实体具有惰性关系的实体。以下是我尝试过的两件事。第一个有效,第二个无效,我不明白为什么。我想要的只是从数据库中获取实体。我将它放在其他方法中的原因是我不希望第一个是@Transactional,因为它可能需要一些时间来执行。请注意,我没有在第一种方法中再次保存甚至访问数据库,我只需要从数据库中读取一次。
方法 1(按预期工作):
@Override
@Transactional
public void sendEmailToUser(Long exhibitorId) {
EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);
}
private EmailExhibitorTO findExhibitorById(Long id){
return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class);
}
这里的一切都很好,我也得到了实体和惰性初始化实体。
方法 2(不起作用):
@Override
public void sendEmailToUser(Long exhibitorId) {
EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);
}
@Transactional
private EmailExhibitorTO findExhibitorById(Long id){
return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class);
但这不起作用。错误:
有一个映射异常,但那是因为无法获取惰性实体。
我可能只是愚蠢,但如果有什么我不明白的地方,请解释。
提前致谢。
您的私有方法中的 @Transactional
没有效果,因为您是从 class 的另一个方法调用它,绕过了处理事务的代理。
你不能在私有方法上传播事务,你可以在这里看到:
Does Spring @Transactional attribute work on a private method?
基本上,我试图获得一个与另一个实体具有惰性关系的实体。以下是我尝试过的两件事。第一个有效,第二个无效,我不明白为什么。我想要的只是从数据库中获取实体。我将它放在其他方法中的原因是我不希望第一个是@Transactional,因为它可能需要一些时间来执行。请注意,我没有在第一种方法中再次保存甚至访问数据库,我只需要从数据库中读取一次。
方法 1(按预期工作):
@Override
@Transactional
public void sendEmailToUser(Long exhibitorId) {
EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);
}
private EmailExhibitorTO findExhibitorById(Long id){
return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class);
}
这里的一切都很好,我也得到了实体和惰性初始化实体。
方法 2(不起作用):
@Override
public void sendEmailToUser(Long exhibitorId) {
EmailExhibitorTO exhibitorTO = findExhibitorById(exhibitorId);
}
@Transactional
private EmailExhibitorTO findExhibitorById(Long id){
return converter.convert(exhibitorRepository.findById(id), EmailExhibitorTO.class);
但这不起作用。错误:
有一个映射异常,但那是因为无法获取惰性实体。
我可能只是愚蠢,但如果有什么我不明白的地方,请解释。
提前致谢。
您的私有方法中的 @Transactional
没有效果,因为您是从 class 的另一个方法调用它,绕过了处理事务的代理。
你不能在私有方法上传播事务,你可以在这里看到: Does Spring @Transactional attribute work on a private method?