2015-11-07 105 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。

這樣你就可以擁有漂亮,清晰和可維護的代碼。

希望它有幫助!