Hibernate: не может получать данные из связанных таблиц один-к-одному - PullRequest
1 голос
/ 19 марта 2012

Существуют User, Person и Employee сущности.
User знает обо всех параметрах Person и Employee.

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() эти данные Person и Employee равны 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 Ответ

1 голос
/ 19 марта 2012

По умолчанию ассоциации в Hibernate выбираются лениво, если иное не указано в вашей конфигурации Hibernate, или инициализируются в коде. Стремительная загрузка в конфигурации не рекомендуется, чтобы избежать неожиданных последствий. В приведенном выше коде вам потребуется явно инициализировать ассоциации Person и Employee.

Поскольку вы используете Spring, для простоты кодирования вы должны прекратить использование HibernateTemplate (, который не рекомендуется использовать некоторое время ), и перейти непосредственно к использованию Hibernate. Затем вы можете использовать Hibernate.initialize для ассоциаций (или другой метод, например, установить FetchMode) для их инициализации.

...