Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 冬眠:can';t从相关的一对一表中获取数据_Hibernate_Mapping_Fetch_One To One_Subquery - Fatal编程技术网

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 execute
factory.openSession().save或update(user)
您的DAO应该
@Autowire
休眠
会话工厂
,然后调用
getCurrentSession()
。请参阅:。您可以,请参阅我文章中的编辑部分。尝试按照您建议的参考中的操作,但出现异常。
@Transactional
是为DAO方法指定的。对,因为Hibernate需要在事务内部运行。
getHibernateTemplate
在内部执行此操作,所以迁移到原始Hibernate意味着您需要在事务内部执行add事务配置到您的Spring配置。请参阅感谢您的提示。据我所知,建议执行这样的迁移:
getHibernateTemplate().update(用户)
更改为
factory.openSession().saveOrUpdate(用户)
?不幸的是,
非法尝试将集合与两个打开的会话关联
wne execute
factory.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();
...