【问题标题】:Hibernate -> get lazy objectHibernate -> 获取惰性对象
【发布时间】:2015-11-08 17:02:10
【问题描述】:

您好,我有一个问题,我不知道是否可能。我有一道。我有定义经典 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,但我认为它不那么实用。有人知道吗?

【问题讨论】:

  • 延迟加载并不意味着“集合永远不会被加载”。这意味着“只有当你真正需要它时,当调用它的方法时才会加载集合”。做你想做的事情没有问题,除非你在尝试访问集合之前关闭会话。

标签: java hibernate session orm


【解决方案1】:

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

我认为您的问题不是使用延迟加载,而是耦合会话管理代码和 DAO 代码。

如果你正确使用它,Hibernate Lazy 功能会很好。尝试在业务级别而不是 DAO 级别解耦会话管理。我的意思是,当您从视图中调用一些业务逻辑时:

  • 开始/打开会话,然后
  • 开始/打开事务
  • 随心所欲:检索实体、获取关联、更改数据……
  • 提交/回滚事务
  • 刷新并关闭会话

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

这样您将拥有漂亮、清晰和可维护的代码。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 2019-01-28
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多