考虑以下 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/