Я использую 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
Hibernate Envers возвращает неожиданные проверки связанных объектов ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1736942864
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();
Подробнее здесь: [url]https://stackoverflow.com/questions/79357907/hibernate-envers-returns-unexpected-audits-of-related-entities[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия