Hibernate - >得到懒惰的对象

时间:2015-11-07 21:02:56

标签: java hibernate session orm

嗨,我有一个问题,我不知道,如果可能的话。我有一个道。我有实体,我已经定义了经典的OneToMany assoc。

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

OneToMany - &gt; 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,但我认为它不那么实用。有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

如果要将数据从商家移动到视图,请使用VO / DTO以避免延迟问题。

这样你就可以拥有漂亮,清晰和可维护的代码。

希望它有所帮助!