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="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 接口(interface)。在我们的 Hibernate AuditInterceptor 类(实现 Interceptor)中,如果实体是 Auditable 的实例,我们将执行一些审计功能。简而言之,所有这些代码都运行良好...

但是,这个 PersonAddress 表没有经过审核,因为从技术上讲我们没有 POJO...所以我们无法检查某些“instanceof”。在 hibernate 配置中是否有任何方法可以告诉它拦截此 PersonAddress 表?也许我们需要处理拦截器中的其他操作之一(例如 onCollectionUpdate)。我不确定...

我能想到的强制审核的唯一其他方法是将关系转换为从 Person 到 PersonAddress 的一对多关系,从 Address 到 PersonAddress 的一对多关系,并为 PersonAddress 创建另一个类元素多对一映射回人员和地址。

这看起来有点像额外的工作,我真的想避免额外的工作。

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

谢谢!

最佳答案

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

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

例如,当面:

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

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

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

关于java - Hibernate 可审计的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/826781/

相关文章:

java - 线程中出现异常 "main"java.lang.NullPointerException InputStreamReader

java - 如何在 session 中存储检索对象并在之后访问它?

hibernate - Grails错误spi.SqlExceptionHelper- 'field list'中的未知列

java - 在 Android 中合并两个/多个图像(小部件)

Java - 如何通过套接字在字符串之间有效发送二进制数据?

java - 在 JFrame 中使用 Darcula LAF

java - 使用 Transformer 时的 Hibernate 异常 PropertyNotFoundException

java - Hibernate 默认架构不起作用

java - 在运行时按需创建模式和表

java - 是否有可能将内部联接选择结果转换为嵌套列表 JSON?