Hibernate Envers: как получить ревизию от исторической сущности

Я должен упустить что-то очевидное; однако я изо всех сил пытаюсь найти ответ на проблему, с которой я столкнулся с Hibernate Envers.

Допустим, у меня есть класс сущностей с именем MyObject, который проверяется с помощью envers.

Если я получу текущую копию экземпляра MyObject, делая что-то вроде:

Session session = sessionFactory.getCurrentSession();
MyObject myobject1 = (MyObject) session.get(MyObject.class, 1234);

И я получаю историческую копию (из ревизии 2) того же экземпляра:

Session session = sessionFactory.getCurrentSession();
AuditReader reader = AuditReaderFactory.get(session);
MyObject myobject2 = reader.find(MyObject.class, 1234, 2);

Есть ли способ отличить myobject1 от myobject2? Как я узнаю, что myobject1 был текущей копией, а myobject2 был из версии 2?


person subie    schedule 20.09.2013    source источник


Ответы (1)


Нет никакого "официального" способа. Оба являются просто объектами, созданными с разными данными.

Однако вы можете проверить, содержит ли session myobject1/myobject2 (используя метод contians: http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html). Это будет работать до тех пор, пока вы не очистите или не измените контекст сохраняемости, и вернет true для «текущих» сущностей и false для исторических. Но это скорее обходной путь, чем правильное решение.

person adamw    schedule 22.09.2013
comment
Адам, спасибо за предложение; однако contains не помогает мне определить версию исторической сущности. Это должно быть известно внутренне, так как можно пройтись по отношениям и получить правильную версию объекта. Думаю, мне придется копнуть глубже, чтобы увидеть, смогу ли я выставить ревизию. - person subie; 23.09.2013
comment
Что ж, это будет та же самая ревизия, которую вы использовали для чтения исходной исторической сущности :) И да, ревизия хранится в прокси, которые используются для обхода отношений. - person adamw; 23.09.2013
comment
Я попытался максимально упростить этот вопрос, чтобы убрать шум. Я надеюсь, что это не делает мою точку зрения менее ясной! В тот момент, когда я хочу знать, является ли объект, который у меня есть, текущим или историческим, я не знаю, какая версия была использована для получения объекта. Я надеялся на что-то вроде: Long revision = session.contains(myobject) ? null : reader.getRevision(myobject); - person subie; 23.09.2013
comment
В настоящее время такого метода нет, к сожалению. - person adamw; 24.09.2013