0

我正在尝试使用 Spring 的 Hibernate Template 懒惰地初始化我的一对多关系。

我已阅读以下指南。 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 statement(expose sql)

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

4

2 回答 2

1

毕竟,这是适用于您发布的示例的怪异和肮脏的解决方案,而不是最佳实践。
您可以使用 1 个会话和 2 个 sql 执行此代码(更少是不可能的,因为您正在执行两条单独的指令)。
简而言之,您必须从 spring-context 中获取 sessionFactory,打开会话,编写代码并关闭会话;事务由spring直接管理!在你的主要做:

/*...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();
于 2013-08-06T05:56:50.327 回答
0

为了将所有内容保留在一个会话中,您需要在一个会话中调用这些方法。最简单的方法是使用 Spring 的声明式事务支持,最好用@Transactional. 这些查找方法将从调用者那里“继承”事务,而不是创建新的。

于 2013-08-06T05:37:23.337 回答