Как я могу реализовать переносимый метод JPA isDirty ()? - PullRequest
3 голосов
/ 03 ноября 2011

Я пытаюсь отследить изменения в ассоциациях 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 оборачивает мой CAArrayList в этот объект с PersistentBag:

((CAArrayList) obj.getSomeList()).isDirty()

Следующий работает, но не переносим между различными реализациями JPA.

((PersistentBag) obj.getSomeList()).isDirty()

Как это сделать портативным способом?

1 Ответ

2 голосов
/ 03 ноября 2011

Я думаю, что вы пытаетесь сделать это на неправильном уровне (слишком низко).

Вместо того, чтобы пытаться отследить все внутренние изменения в списке SomeType, инкапсулируйте функциональные изменения этого списка в конкретной службе, которой делегируются все другие службы (и уровень представления), когда этот список должен быть изменен. В этой централизованной службе уведомляйте подписчиков, когда служба меняет список SomeType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...