Java 休眠可审核的多对多关系

Java 休眠可审核的多对多关系,java,hibernate,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="a

考虑以下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 AuditionInterceptor类实现拦截器中,如果实体是可审计的实例,我们将执行一些审计功能。简而言之,所有这些代码都非常有效

然而,有一个PersonalAddress表没有得到审核,因为我们在技术上没有POJO…所以我们不能检查它的一些实例。在hibernate配置中是否有任何方法可以让它截取这个PersonalAddress表?也许我们需要处理来自拦截器的其他操作之一,比如onCollectionUpdate。我不确定

我能想到的另一种强制它进行审计的方法是,将关系转换为从Person到PersonalAddress的一对多、从Address到PersonalAddress的一对多,并为PersonalAddress创建另一个类元素,该类元素将多对一映射回Person和Address

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

有人能提出更好的解决方案吗


谢谢

您如何将地址添加到个人,以及如何将个人添加到地址?因为您没有PersonalAddress的域对象,所以对这些关系的编辑必须是Person或Address中的一个,不是吗

如果是这样,那么审计就作为个人或地址审计的一部分进行

例如,亲自:

class Person {
    private List<Address> addedAddresses;
    private Set<Address> addresses;
    .
    .
    .
    public void addAddress(Address toAdd) {
        addedAddresses.add(toAdd);
        addresses.add(toAdd);
    }
}
然后,在审核人员时,记录记录到AddedAddress的条目(如果它不是空的)


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

我无法通过多对多映射来理解它,因此我将该映射转换为一对多,并使用适当的hibernate映射为PersonalAddress创建了一个模型bean


谢谢

事实上,我们将数据添加到Person和Address对象中。我们发现Hibernate不会以其他方式更新PersonalAddress表。我们使用的是在曼宁的《Hibernate in Action》第343页中找到的AuditLoginInterceptor的修改版本。总体思路保持不变,这意味着我们没有专门的逻辑来检查POJO。如果提供的实体类型为Auditable,我们将其添加到更新、插入或删除集合中。我们可以为这两个特定的类添加一些逻辑,但是,我们真的不知道这种关系是否以某种方式发生了变化。。。