如何实现便携式JPA isDirty()方法?

时间:2011-11-03 15:35:31

标签: java hibernate jpa

我正在尝试跟踪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()

如何以便携方式完成?

1 个答案:

答案 0 :(得分:2)

我认为你试图在错误的级别(太低)做到这一点。

不是尝试跟踪SomeType列表的所有内部更改,而是在特定服务中封装对此列表的功能更改,当必须修改此列表时,所有其他服务(和表示层)将委派给该服务。在此集中式服务中,当服务更改SomeType列表时通知订户。