2009-05-05 63 views
1

考慮下面的hibernate配置:Hibernate的可審計的許多一對多的關係

<class name="Person"> 
<id name="id" column="personId"> 
    <generator class="native"/> 
</id> 
<set name="addresses" table="PersonAddress"> 
    <key column="personId"/> 
    <many-to-many column="addressId" 
     class="Address"/> 
</set> 
</class> 

<class name="Address"> 
<id name="id" column="addressId"> 
    <generator class="native"/> 
</id> 
<set name="people" inverse="true" table="PersonAddress"> 
    <key column="addressId"/> 
    <many-to-many column="personId" 
     class="Person"/> 
</set> 
</class> 

現在,這兩個班組長(Person和Address)有一個可審覈的接口。在我們的Hibernate AuditInterceptor類(實現Interceptor)中,如果實體是可審計的實例,我們執行一些審計功能。總之,所有這些代碼的作品很好...

但是,這是PersonAddress表沒有得到審計,因爲我們沒有技術上有一個POJO它...所以我們不能檢查一些「的instanceof」。在hibernate配置中有任何方法可以告訴它攔截這個PersonAddress表嗎?也許我們需要處理攔截器的其他動作之一(如onCollectionUpdate)。我不確定...

我認爲強制審計的唯一方法是將關係轉換爲從Person到PersonAddress的一對多關係,從Address到PersonAddress的一對多關係併爲PersonAddress創建另一個類元素,將多對一映射返回給Person和Address。

這似乎有點像額外的工作,我真的想避免額外的工作。

有人可以提出更好的解決方案嗎?

謝謝!

回答

0

我無法通過多對多的映射找到它,所以我將該映射轉換爲一對多,並使用適當的hibernate映射爲PersonAddress創建了一個模型bean。

謝謝!

0

你如何給一個人添加地址,以及個人到某個地址?由於您沒有PersonAddress的域對象,因此對這些關係的編輯必須發生Person或Address之一,否?

如果是這樣,那麼審覈將作爲個人或地址審覈的一部分進行。

例如,在人:

class Person { 
    private List<Address> addedAddresses; 
    private Set<Address> addresses; 
    . 
    . 
    . 
    public void addAddress(Address toAdd) { 
     addedAddresses.add(toAdd); 
     addresses.add(toAdd); 
    } 
} 

然後,審計人的時候,記錄記錄addedAddresses如果它不是空的條目。

當然,這很簡單(如何刪除?以及編輯地址?),但在您的示例中沒有更多內容。

+0

我們實際上將數據添加到Person和Address對象。我們發現Hibernate不會更新PersonAddress表。 我們正在使用在Manning的Hibernate In Action(第343頁)中找到的AuditLogInterceptor的修改版本。總體思路保持不變,這意味着我們沒有檢查POJO的專業邏輯。如果提供的實體屬於可審計類型,我們將其添加到更新,插入或刪除的集合中。 我們可以放入這兩個特定類的邏輯,但是,我們真的不知道這種關係是否以某種方式發生了變化...... – 2009-05-06 14:36:16