2011-02-13 70 views
2

我有一个帐户实体和一个AccountTransaction实体。休眠一对多+懒加载

账户1 < ---->ň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)); 

但我也想帐户实体有一种方法

List<AccountTransaction> getTransactions(); 

而且我想这被延迟加载,因为我甚至可能不需要列出事务。

由于我已经从AccountTransaction中指定了多对一的关系,现在我该如何指定一个一对多的关系,使我能够从另一个方向进行访问。

此外,什么是处理延迟加载的最佳方式,是否必须为每个实体分配会话并且不关闭会话?尽管我可能会有太多的会议。

谢谢。

+0

不是懒加载默认?尝试访问会话之外的事务 - 你应该得到一个异常。 – extraneon 2011-02-13 15:14:20

+0

是的。我只是不知道如何指定一对多关系,这为我提供了一种获取属于某个帐户的所有交易的方法。当我们懒懒地装载时,我也不知道如何避免异常。 – 2011-02-13 15:24:35

+0

P.s我可以很容易地获得交易,使用标准和帐户过滤。能够从Account实例本身获得它们会更方便,并且对我来说输入更少:) – 2011-02-13 15:25:44

回答

2

如果您在您的账户类Hibernate映射添加一个一对多的关联,您将获得:

List<AccountTransaction> getTransactions(); 
任何ORM创建工具

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

1

为了使用延迟加载,您应该在启用视图中打开会话。 如果您使用Spring集成,您可以使用OpenSesionInViewIntereptor/OpenSessionInViewFilter

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

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

希望它能帮助。