Hibernate Lazy加载和初始化

时间:2013-08-06 04:49:39

标签: java spring hibernate

我试图使用Spring的Hibernate模板初始化我的一对多关系。

我已阅读以下指南。 http://dinukaroshan.blogspot.sg/2012/08/lazyeager-loading-using-hibernate-by.html

参考这些代码

/** 
  * {@inheritDoc} 
  */  
 public Child getChildByIdWithoutToys(Long childId) {  
  return getHibernateTemplate().get(Child.class, childId);  
 }  

 /** 
  * {@inheritDoc} 
  */  
 public Child getChildByIdWithToys(Long childId) {  
  Child child = getChildByIdWithoutToys(childId);  
  /** 

上面的代码使用2个session和2个sql语句(公开sql)

有没有办法在一个会话和一个sql语句中执行此操作(hibernate_showsql = true)

2 个答案:

答案 0 :(得分:1)

在所有情况下,这是一个怪癖和肮脏的解决方案,适用于你发布的问题,而不是最好的实践。
您可以使用1个会话和2个sql执行此代码(因为您正在执行两个单独的指令,因此可以实现这一点)。简而言之,您必须从spring-context获取sessionFactory,打开会话,执行代码和闭会;交易由春天直接管理! 在你的主要做:

/*...object creation... */
final SessionFactory sf = context.getBean("sessionFactory");
/* Session creation */
final Session s = sf.openSession();
ChildDAO childDAO = (ChildDAO) context.getBean("childDAO");

childDAO.persistChild(child);
/*other code*/
/* session close */
s.close();

答案 1 :(得分:0)

为了将所有内容保存在一个会话中,您需要从一个会话中调用这些方法。最简单的方法是使用Spring的声明式事务支持,最好使用@Transactional标记顶级方法(可以进入整体持久性系统)。这些查找方法将从其调用者“继承”事务,而不是创建新事务。