Hibernate Auditable多对多关系

时间:2009-05-05 20:28:32

标签: java 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)具有Auditable接口。在我们的Hibernate AuditInterceptor类(实现Interceptor)中,如果实体是Auditable的实例,我们将执行一些审计功能。简而言之,所有这些代码都很有用......

但是,这个PersonAddress表没有被审计,因为我们在技术上没有POJO ...所以我们不能检查一些“instanceof”。在hibernate配置中是否有任何方法可以告诉它截取此PersonAddress表?也许我们需要处理来自Interceptor的其他一个动作(比如onCollectionUpdate)。我不确定......

我认为强制它进行审计的唯一另一种方法是将关系转换为从Person到PersonAddress的一对多,从Address转换为PersonAddress的一对多,并为PersonAddress创建另一个类元素多对一的映射回到人和地址。

这似乎有点像额外的工作,我真的想避免额外的工作。

有人可以提出更好的解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您如何向某人添加地址,以及将人员添加到地址?由于您没有PersonAddress的域对象,那么对这些关系的编辑必须发生在Person或Address之一,不是吗?

如果是,则将审核作为人员或地址审核的一部分进行。

例如,在Person:

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

然后,在审核Person时,如果记录的条目不为空,则记录记录到addAddresses的条目。

当然,这很简单(如何处理删除?对地址进行编辑?)但在您的示例中没有更多内容。

答案 1 :(得分:0)

我无法通过多对多映射来解决这个问题,因此我将该映射转换为一对多,并为PersonAddress创建了一个具有适当hibernate映射的模型bean。

谢谢!