- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的项目过去到处都有很多 @Transactional 方法。现在,由于业务逻辑,我不想在遇到问题时回滚,而是想将我的对象设置为错误状态(又名保存在数据库中,所以绝对不回滚),所以我删除了一些 @Transactional 来开始。
现在的问题是,在没有 session 的情况下进行延迟加载,从而产生 LazyInitializationException。
现在这是我迄今为止的以下故障排除和解决方案寻求:
我们使用注释配置,因此此处没有 xml 配置。
对于使用数据库的每个操作,都会创建一个EntityManager(在服务中定义为属性和@Autowired),然后将其删除(当添加配置来查看它们时,我可以在日志中清楚地看到它),根据 Spring 文档,这显然是正常的。
将 @PersistenceContext 或 @PersistenceUnit 与 EntityManagerFactory 或 EntityManager 一起使用不起作用。
我可以加载我想要与 Hibernate.initialize() 一起使用的延迟加载属性,然后它就不会产生 LazyInitializationException。
现在我的问题是:为什么 hibernate 不能自己完成?对我来说,如果我使用延迟加载,我希望 Hibernate 创建一个 session (在执行 Hibernate.initialize() 时他似乎完全能够做到这一点)来自动加载日期,这似乎微不足道。
是否有一种方法可以生成一个新的实体管理器以在我的方法中使用,这样 Hibernate 就不会一直创建和重新创建实体管理器?我真的觉得我错过了一些有关 Hibernate、延迟加载和 session 的基本知识,这些知识使整个困惑变得不那么复杂。
这是一个例子:
@Entity
@Table(name = "tata")
public class Tata {
@Id
@Column(name = "tata_id")
private Long id;
// getter / setter etc
}
@Entity
@Table(name = "toto")
public class Toto {
@Id
@Column(name = "toto_id")
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "tata_id")
private Tata tata;
// getter / setter etc
}
@Service("totoManager")
public class TotoManager extends GenericManagerImpl {
@Autowired
private EntityManager entityManager;
@Autowired
private TotoRepository totoRepository;
public void doSomethingWithTotos() throws XDExceptionImpl {
List<Toto> totos = this.totoRepository.findAll();
for (toto toto : totos) {
// LazyInitializationException here
LOGGER.info("tata : " + toto.getTata().getId());
}
}
}
最佳答案
Hibernate 可以自己完成。通过设置属性 hibernate.enable_lazy_load_no_trans=true
(对于 Spring Boot,它应该是 spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
),您可以在事务处理时加载任何惰性属性关闭。这种方法有一个巨大的缺点:每次加载惰性属性时,hibernate 都会打开 session 并在后台创建事务。
我建议通过 entityGraphs 获取惰性属性。因此,您不必将持久上下文移至上层或更改实体中的获取类型。
关于java - 惰性初始化异常 : Why can't Hibernate create a session on lazy loading?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55262443/
我是一名优秀的程序员,十分优秀!