Hibernate Envers возвращает неожиданные проверки связанных объектовJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Hibernate Envers возвращает неожиданные проверки связанных объектов

Сообщение Anonymous »

Я использую Envers для аудита изменений в моей базе данных, где у меня много связанных объектов. Примером может быть
@Entity
@Audited
class A{

@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.DETACH, CascadeType.MERGE,
CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(...)
private List b;

// Constructors, Getters, etc ...
}

@Entity
@Audited
String fieldB;
@ManyToMany(fetch as above, mappedBy="a")
@JoinTable(...)
private List a;

@ManyToMany(fetch as in A.b)
@JoinTable(...)
private List c;

// Constructors, Getters, etc ...
}

@Entity
@Audited
@class C{
String fieldC;
@ManyToMany(fetch as in A.b, mappedBy="c")
@JoinTable(...)
private List b;

// Constructors, Getters, etc ...
}

Каждый раз, когда я вношу изменения в A или B, включая добавление экземпляра A в B.a или наоборот, это создает аудит в таблицах аудита каждого экземпляра, и я могу откатить состояние любого экземпляра для этого аудита.
Проблема возникает, когда у меня есть следующая история изменений:



Редакция
Описание
Создает аудит в




1
Создать
А


2
Создать Б
Б


3
Добавьте B к A
A,B

4
Создать C
C


5
Добавьте C к B
B,C


...
Некоторые несвязанные изменения



x
Изменить C
C


...
Некоторые несвязанные изменения



y
Изменить Б
B


...
Некоторые несвязанные изменения



z
Отметка времени, которую я хочу получить



...
Некоторые несвязанные изменения




Что я Ожидается, что это произойдет, когда при получении состояния любого из объектов во временной метке z нужно получить A на версии 3, B на rev y и C на rev x (т.е. что Envers извлекает новейшее состояние всех объектов на момент извлечения).
Вместо этого происходит то, что если я извлекаю A с отметкой времени z, A и B извлекаются с версией 3, C является нулевым. Если я получаю C, A находится в версии 3, C находится в состоянии x, а B находится в состоянии 5.
Итак, кажется, что когда я получаю объект в версии z, все связанные вместо этого объекты извлекаются с ревизией z', которая является последней ревизией самого рассматриваемого объекта.
Это вопрос неправильных свойств или есть другое элегантное решение, которое могло бы помочь мне получить текущее состояние сущности и ее отношений в данный момент времени?
Изменить:
Это также может быть связано с тем, как я запрашиваю версию (ниже):
add(AuditEntity.revisionNumber().le(revis_no)) может установить максимальный номер версии, меньший, чем revis_no, который был найден для данного экземпляра, в качестве нового максимума для других проверок.
В этом случае можно будет найти максимальный номер версии для всех связанных объектов и использовать его в качестве нового номера версии для запроса?
Object[] revision = (Object[]) reader.createQuery()
.forRevisionsOfEntity(objectClass, false, true)
.add(AuditEntity.property("id").eq(entityObject.getId()))
.add(AuditEntity.revisionNumber().le(revis_no))
.addOrder(AuditEntity.revisionNumber().desc())
.setMaxResults(1)
.getSingleResult();


Подробнее здесь: https://stackoverflow.com/questions/793 ... d-entities
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»