получить свежий объект данных в Apache Cayenne - PullRequest
0 голосов
/ 28 марта 2012

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

Цена на продукт x была изменена пользователем U

(предположим, что цена и продукт находятся в одной таблице.)

, для этого я хочу отслеживать столбец цены продукта x.

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

В настоящее время я использую apache cayenne и при предварительном обновлении (в классе сущности) перезваниваю. Я хочу сравнить новую цену (которую пользователь выбрал на портале) с ценой, сидящей в базе данных

когда я пытаюсь получить продукт из базы данных, cayenne не возвращает мне свежий объект, а возвращает тот же объект с измененными значениями

Мне было интересно, знает ли кто-нибудь о том, как Cayenne может вернутьмне свежий объект для того же pk (id) (это то, что я использую, чтобы получить свежий объект из БД)

или

может посоветовать мне другой способ

1 Ответ

3 голосов
/ 28 марта 2012

Есть несколько способов подойти к этому.Вот тот, который ИМО является наиболее прозрачным.Хитрость заключается в использовании объекта ObjectContext, отличного от того, который вносит изменения.Затем вы получите отдельную копию объекта, которая будет содержать текущее сохраненное значение:

// 'this' refers to the DataObject being committed (assuming things happen in its callback)

ObjectContext parallelContext = ... // create a new context here like you normally would

// 3.1 API; 3.0.x has a similar method with a slightly different sig
MyClass clone = parallelContext.localObject(this);

// if you are ok with cached old value, ignore the 'invalidateObjects' call.
// If not, uncomment it to ensure the object gets refetched. 
// Also 3.1 API. Should be easy to adjust for 3.0

// parallelContext.invalidateObjects(clone);

Object oldValue = clone.getXyz();
...