代码之家  ›  专栏  ›  技术社区  ›  Tim Reddy

休眠可审核多对多关系

  •  1
  • Tim Reddy  · 技术社区  · 17 年前

    考虑以下休眠配置:

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

    但是,有一个PersonalAddress表没有经过审核,因为我们在技术上没有POJO……所以我们不能检查一些“instanceof”。在Hibernate配置中,有没有什么方法可以让它截取这个PersonalAddress表?也许我们需要处理拦截器的其他操作之一(如OnCollectionUpdate)。我不确定…

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

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

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

    谢谢!

    2 回复  |  直到 17 年前
        1
  •  0
  •   Edward Q. Bridges    17 年前

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

    如果是这样,那么就让审计作为人员或处理审计的一部分进行。

    例如,亲自:

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

    然后,在审核人员时,记录记录到addedAddresses的条目(如果不为空)。

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

        2
  •  0
  •   Tim Reddy    17 年前

    我无法通过多对多的映射来解决这个问题,所以我将该映射转换为一对多的映射,并使用适当的休眠映射为PersonalAddress创建了一个模型bean。

    谢谢!