Hibernate 冬眠:can';t从相关的一对一表中获取数据
有Hibernate 冬眠:can';t从相关的一对一表中获取数据,hibernate,mapping,fetch,one-to-one,subquery,Hibernate,Mapping,Fetch,One To One,Subquery,有用户、个人和员工实体。 用户了解人员和员工 用户的休眠配置: ... <many-to-one name="person" class="entry.Person" column="perid" not-null="true" cascade="all"/> <many-to-one name="employee" class="entry.Employee" column="empid" not-null="true" cascade="all"/> ... 道:
用户
、个人
和员工
实体。用户
了解人员
和员工
用户的休眠配置:
...
<many-to-one name="person" class="entry.Person" column="perid" not-null="true" cascade="all"/>
<many-to-one name="employee" class="entry.Employee" column="empid" not-null="true" cascade="all"/>
...
道:
私有会话工厂;
公共无效设置工厂(会话工厂){
这个工厂=工厂;
}
@交易的
公共列表getUsers(){
会话s=this.factory.getCurrentSession();
...
在尝试执行
getCurrentSession()时,未将休眠会话绑定到线程,并且配置不允许在此处创建非事务会话
默认情况下,除非在Hibernate配置中另有规定或在代码中初始化,否则Hibernate中的关联是延迟获取的。不鼓励在配置中进行即时获取,以避免意外后果。在上面的代码中,您需要显式初始化人员
和员工
协会
由于您使用的是Spring,为了便于编码,您应该停止使用
HibernateTemplate
(),转而直接使用Hibernate。然后,您可以在关联上使用Hibernate.initialize
(或其他一些方法,如设置FetchMode
)初始化它们。默认情况下,除非在Hibernate配置中另有规定或在代码中初始化,否则Hibernate中的关联是延迟获取的。不鼓励在配置中进行急切获取,以避免意外后果。在上面的代码中,您需要显式初始化人员
和Employee
协会
由于您使用的是Spring,为了便于编码,您应该停止使用
HibernateTemplate
(),转而直接使用Hibernate。然后,您可以在关联上使用Hibernate.initialize
(或其他一些方法,如设置FetchMode
)来初始化它们。谢谢你的提示。据我所知,建议进行这样的迁移:getHibernateTemplate().update(user)
更改为factory.openSession().saveOrUpdate(user)
?不幸的是,非法尝试将集合与两个打开的会话相关联wne executefactory.openSession().save或update(user)
您的DAO应该@Autowire
休眠会话工厂
,然后调用getCurrentSession()
。请参阅:。您可以,请参阅我文章中的编辑部分。尝试按照您建议的参考中的操作,但出现异常。@Transactional
是为DAO方法指定的。对,因为Hibernate需要在事务内部运行。getHibernateTemplate
在内部执行此操作,所以迁移到原始Hibernate意味着您需要在事务内部执行add事务配置到您的Spring配置。请参阅感谢您的提示。据我所知,建议执行这样的迁移:getHibernateTemplate().update(用户)
更改为factory.openSession().saveOrUpdate(用户)
?不幸的是,非法尝试将集合与两个打开的会话关联
wne executefactory.openSession().saveOrUpdate(user)
DAO应该@Autowire
休眠会话工厂
,然后调用getCurrentSession()
。请参阅:。您可以,请参阅我文章中的编辑部分。尝试按照您建议的参考中的操作,但出现异常。@Transactional
是为DAO方法指定的。对,因为Hibernate需要在事务内部运行。getHibernateTemplate
在内部执行此操作,所以迁移到原始Hibernate意味着您需要在事务内部执行ad将事务配置添加到Spring配置中。请参阅
public List<User> getUsers() {
return getHibernateTemplate().find("from User");
}
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
...
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="userDao" class="dao.UserDaoHibernate">
<property name="factory">
<ref local="sessionFactory"/>
</property>
</bean>
private SessionFactory factory;
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
@Transactional
public List<User> getUsers() {
Session s = this.factory.getCurrentSession();
...