考虑以下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创建另一个类元素多对一的映射回到人和地址。
这似乎有点像额外的工作,我真的想避免额外的工作。
有人可以提出更好的解决方案吗?
谢谢!
答案 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。
谢谢!