2009-05-05 72 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