我试图使用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)
答案 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
标记顶级方法(可以进入整体持久性系统)。这些查找方法将从其调用者“继承”事务,而不是创建新事务。