Каков наилучший метод получения изменений в иерархии объектов в Apache Cayenne? - PullRequest
0 голосов
/ 10 октября 2019

Я оцениваю Cayenne для некоторых новых проектов.

Интересно, возможно ли (для утверждений модульного теста) отразить изменения, внесенные протестированным кодом в ObjectContext (или некоторое базовое представление данных), предпочтительно до вызова метода commitChanges, и каков наилучший метод дляЭто? Меня интересует перечисление подлежащих обновлению / добавлению / удалению объектов или строк, а также обновляемых объектов или строк. Меня также интересуют, какие атрибуты / столбцы действительно изменились?

1 Ответ

0 голосов
/ 11 октября 2019

Отслеживание изменений в Cayenne может быть выполнено на нескольких уровнях:

  1. Самый удобный и полный API для захвата до и после «дельт» предоставляется cayenne-commitlog, но работает только во время коммита.

  2. Поиск «грязных» объектов в контексте в любое время, прежде чем коммит будет выполнен с помощью ObjectContext.uncommittedObjects(), ObjectContext.newObjects(),ObjectContext.deletedObjects(), ObjectContext.modifiedObjects().

  3. Если вы хотите копать глубже с # 2 и отслеживать отдельные изменения объектов перед фиксацией, вы можете взглянуть на ObjectStore, хотя этот APIпредназначен для использования внутри фреймворка, поэтому он требует некоторых прыжков через обручи. На Кайенской стороне определенно есть место для улучшения:

ObjectStore os = (ObjectStore) context.getGraphManager();

// get DB snapshot of an object that can be compared with the object current state
DataRow previousState = os.getSnapshot(o.getObjectId());

// also there's a full diff available, but unfortunately "getChanges" is package-private,
// so can only be accessed via some reflection hacks (or a custom utility class placed 
// in "org.apache.cayenne.access" package). 
// Cayenne should make it public in the future I think.
GraphDiff diff = os.getChanges();
diff.apply(myChangeTrackingVisitor);
...