2015-11-07 56 views
0

嗨我有一个问题,我不知道,如果有可能。我有一个道。我有我定义经典OneToMany assoc的实体。休眠 - >获取懒惰对象

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

OneToMany - > fetch的默认值是Lazy。在道我有方法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(); 

我可以@Override方法findById在具体使用Hibernate.initialize()的Dao类,但我认为它没有那么实际。有人有什么想法吗?

+0

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

回答

2

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

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

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

  • 开始/打开的会话,然后
  • 开始/打开的事务
  • 你想要做什么:检索实体,得到协会,更改数据,.. 。
  • 提交/回滚事务
  • 冲洗和关闭会话

如果你想将数据从业务转到查看,使用VO/DTO避免懒亲blems。

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

希望它有帮助!