2011-02-13 95 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

希望它能幫助。