我正在尝试跟踪JPA OneToMany关联中的更改,以便通知订阅者有关对象的某个区域(其中一个关联)已更改的事件。我首先尝试了一个了解更改的List专业化。
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "col_name")
private List<SomeType> oneOfManyLists = new CAArrayList<SomeType>();
我的装饰师看起来像这样:
public class CAArrayList<T> extends ArrayList<T> {
private boolean changed = false;
public CAArrayList() {
super();
}
public boolean isChanged() {
return changed;
}
// Mutable delegates
@Override
public boolean add( T e) {
changed = true;
return super.add( e );
}
....
}
在DAO中,我想检查哪个OneToMany关联已被更改, 不幸的是,以下行导致了ClassCastException,因为Hibernate用PersistentBag包装我的CAArrayList:
((CAArrayList) obj.getSomeList()).isDirty()
下一个可以工作,但在JPA的不同实现之间不可移植。
((PersistentBag) obj.getSomeList()).isDirty()
如何以便携方式完成?
答案 0 :(得分:2)
我认为你试图在错误的级别(太低)做到这一点。
不是尝试跟踪SomeType列表的所有内部更改,而是在特定服务中封装对此列表的功能更改,当必须修改此列表时,所有其他服务(和表示层)将委派给该服务。在此集中式服务中,当服务更改SomeType列表时通知订户。