Hibernate один-ко-многим + ленивая загрузка - PullRequest
2 голосов
/ 13 февраля 2011

У меня есть сущность Account и сущность AccountTransaction.

Аккаунт 1 <----> n AccountTransaction

В моем AccountTransaction.hbm.xml я указываю отношение многие-к-одному:

<hibernate-mapping>
<class name="com.walshk.accountmanager.domain.AccountTransaction" table="AccountTransaction">

    <id name="id" type="long" column="transaction_id">
        <generator class="increment"/>
    </id>

    <property name="date" not-null="true" type="date" column="transaction_date"/>

    <property name="description" not-null="true" column="transaction_description" length="500"/>

    <property name="amount" column="transaction_amount" not-null="true"/>

    <many-to-one name="account" column="account_id" not-null="true" cascade="all" lazy="false"/>

</class>
</hibernate-mapping>

Это позволяетя могу искать AccountTransactions по учетной записи, используя

Criteria criteria = session.createCriteria(AccountTransaction.class)
    .add(Restrictions.eq("account", account));

, а также позволяет мне получить экземпляр Account с помощью AccountTransaction # getAccount ();

Теперь я хочу предоставить способ получитьучетная запись, например

Criteria criteria = session.createCriteria(Account.class).add(Restrictions.eq("id", id));

Но я также хочу, чтобы у сущности Account был метод

List<AccountTransaction> getTransactions();

И я хочу, чтобы он загружался лениво, поскольку мне даже не нужно перечислятьтранзакции.

Поскольку я уже определяю отношение «многие-к-одному» из AccountTransaction, как мне теперь указать отношение «один ко многим», предоставляя мне доступ с другого направления.

Кроме того, каков наилучший способ обработки отложенной загрузки, нужно ли назначать сеанс каждому объекту, а не закрывать сеанс?Я потенциально могу открыть слишком много сессий.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Если вы добавите ассоциацию «один ко многим» в отображении спящего класса вашего аккаунта, вы получите:

List<AccountTransaction> getTransactions();

из любого инструмента создания ORM.Одним из параметров этой ассоциации является тип загрузки - я не знаком с точным синтаксисом в отображении XML, поскольку мы используем аннотации, но вы, вероятно, можете найти его на любой странице справки / документации по отображению XML в спящем режиме.

1 голос
/ 13 февраля 2011

Для того, чтобы работать с отложенной загрузкой, у вас должна быть включена функция Open Session in view. Если вы используете интеграцию Spring, у вас есть OpenSesionInViewIntereptor / OpenSessionInViewFilter

Если вы используете нативный Hibernate без интеграции с Spring, вы можете реализовать его самостоятельно. Пожалуйста, прочитайте следующее:

http://community.jboss.org/wiki/OpenSessioninView

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...