gpt4 book ai didi

java - Hibernate -> 获取惰性对象

转载 作者:行者123 更新时间:2023-12-02 04:13:13 26 4
gpt4 key购买 nike

您好,我有一个问题,我不知道是否可能。我有一道。我有一个实体,我在其中定义了经典的 OneToMany 关联。

@OneToMany
public Set<InterviewEntity> getCreatedInterviews() {
return createdInterviews;
}

OneToMany -> fetch 的默认值为 Lazy。在 dao 中我有方法 findById()...

见下文:

 @Override
public T findById(long id) {
Session session = sessionFactory.openSession();
T entity = (T) session.get(thisClass, id);
session.close();

return entity;
}

我只想这样:

EmployeeEntity resultEmployee = employeeDao.findById(employeeEntity.getEmployeeId());
resultEmployee.getCreatedInterviews();

我可以使用 Hibernate.initialize() 在具体 Dao 类中 @Override 方法 findById 但我认为这不太实用。有人有什么想法吗?

最佳答案

您的代码在实体检索后立即关闭session,因此您的resultEmployee.getCreatedInterviews()将无法工作,因为没有打开的 session 。

我认为你的问题不在于使用延迟加载,而是耦合 session 管理代码和 DAO 代码。

如果您正确使用 Hibernate Lazy 功能,它会非常有用。尝试在业务级别而不是 DAO 级别解耦 session 管理。我的意思是,当您从 View 中调用某些业务逻辑时:

  • 开始/打开 session ,然后
  • 开始/打开交易
  • 做你想做的事:检索实体、获取关联、更改数据......
  • 提交/回滚事务
  • 刷新并关闭 session

如果您想将数据从业务移动到 View ,请使用 VO/DTO 以避免 Lazy 问题。

这样您就会拥有漂亮、清晰且可维护的代码。

希望对你有帮助!

关于java - Hibernate -> 获取惰性对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587743/

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