Hibernate:无法从相关的一对一表中获取数据

时间:2012-03-19 16:02:56

标签: hibernate mapping fetch one-to-one subquery

UserPersonEmployee个实体 User了解PersonEmployee

用户的hibernate配置:

...
<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"/>
...

DAO:

public List<User> getUsers() {
    return getHibernateTemplate().find("from User");
}

使用getUsers()获取用户时,PersonEmployee数据为NULL

我是否错过了某些.hbm配置,或者我应该手动向DAO添加更多子选择?

修改
上下文:

    <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>

DAO:

    private SessionFactory factory;

    public void setFactory(SessionFactory factory) {
        this.factory = factory;
    }

    @Transactional
    public List<User> getUsers() {      

        Session s = this.factory.getCurrentSession();
...
当尝试执行No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

时,

获得getCurrentSession()

1 个答案:

答案 0 :(得分:1)

默认情况下,除非在Hibernate配置中另有指定或在代码中初始化,否则Hibernate中的关联是延迟提取的。不鼓励在配置中提取,以避免意外后果。在上面的代码中,您需要明确初始化PersonEmployee关联。

由于您使用的是Spring,为了便于编码,您应该停止使用HibernateTemplatewhich hasn't been recommended to use for a while),然后直接转到使用Hibernate。然后,您可以对关联(或其他一些方法,如设置Hibernate.initialize)使用FetchMode来初始化它们。