【问题标题】:Hibernate one-to-many + lazy loadingHibernate 一对多 + 延迟加载
【发布时间】:2011-02-13 15:08:49
【问题描述】:

我有一个 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));

还允许我使用 AccountTransaction#getAccount(); 获取 Account 实例;

我现在想做的是提供一种获取帐户的方法,例如

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

但我也希望 Account 实体有一个方法

List<AccountTransaction> getTransactions();

我希望它是延迟加载的,因为我什至可能不需要列出交易。

由于我已经在 AccountTransaction 中将关系指定为多对一,我现在如何指定一对多关系以允许我从另一个方向访问。

此外,处理延迟加载的最佳方法是什么,我是否必须为每个实体分配一个会话而不关闭会话?不过,我可能打开了太多会话。

谢谢。

【问题讨论】:

  • 延迟加载不是默认的吗?尝试访问会话之外的事务 - 你应该得到一个异常。
  • 是的。我只是不知道如何指定一对多关系,这为我提供了一种获取属于一个帐户的所有交易的方法。而且我不知道如何在延迟加载时避免异常。
  • P.s 我可以很容易地获得交易,使用标准并按帐户过滤。能够从 Account 实例本身获取它们会更方便,并且对我来说输入更少:)

标签: java hibernate hibernate-mapping


【解决方案1】:

如果您在 Account 类休眠映射中添加一对多关联,您将获得:

List<AccountTransaction> getTransactions();

来自任何 ORM 创建工具。 此关联的参数之一是加载类型 - 我不熟悉 XML 映射中的确切语法,因为我们使用注释,但您可能可以在任何 hibernate XML 映射的参考/文档页面中找到它。

【讨论】:

  • 有道理,但是我不能在映射文件中使用一对多的 xml 标记。我会再看一下文档。谢谢。
  • 太棒了,我使用 Account.hbm.xml 文件中的 xml 标签让它工作了。正是我想要的:) 非常感谢。
【解决方案2】:

为了使用延迟加载,您应该启用 Open Session in view。 如果您使用的是具有 OpenSessionInViewIntereptor/OpenSessionInViewFilter 的 Spring 集成

如果您使用的是没有集成 Spring 的原生 Hibernate,那么您可以自己实现它。 请阅读以下内容:

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

希望对你有帮助。

【讨论】:

  • 感谢您的链接。帮助加载有关延迟加载的内容。我接受了你的回答,因为它回答了我问题的第二部分。
  • 不客气。这就是我喜欢 Spring 的原因,它允许我使用配置中的一行来使用延迟加载。
  • 春天是下一个。只是想确保我了解底层的休眠位,并且至少可以在继续之前得到一些工作。
猜你喜欢
  • 1970-01-01
  • 2013-08-01
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多