gpt4 book ai didi

java - 惰性初始化异常 : Why can't Hibernate create a session on lazy loading?

转载 作者:行者123 更新时间:2023-12-02 10:07:16 28 4
gpt4 key购买 nike

我的项目过去到处都有很多 @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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com