Подтвердить что ты не робот

Какая разница между @NotAudited и RelationTargetAuditMode.NOT_AUDITED в Hibernate EnVers?

@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

Зачем использовать оба? полезно ли использовать оба или достаточно?

4b9b3361

Ответ 1

Использовать NotAudited в полях, когда вы вообще не хотите, чтобы значение/отношение проверялось. Я считаю, что вы можете использовать это на поле с такими отношениями, как OneToMany, ManyToMany или просто Column или без них. Используйте RelationTargetAuditMode.NOT_AUDITED в поле отношений, если вы хотите, чтобы значение проверялось, но не сущность с другой стороны отношения. Например, вы хотите проверить идентификатор/значение ключа, но не соответствующую таблицу.

Вы также можете применить RelationTargetAuditMode ко всему классу, который, я считаю, просто говорит, что для всех отношений в классе не выполняется аудит другого конца. Это смутило меня, поскольку я ошибочно использовал эту аннотацию, чтобы иметь в виду не проверять сущность ниже, что не значит, что это значит. Просто не выполняйте аннотацию аудита в классе сущности вообще, если вы не хотите, чтобы сущность проверялась. В других проверенных сущностях, которые относятся к сущности, вам придется либо использовать NotAudited, либо RelationTargetAuditMode.NOT_AUDITED для поля отношений.

Официальная документация не очень хороша в этой теме (http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html) и даже не упоминает NotAudited.

В моих прошлых проектах мне нужно было провести аудит очень определенного набора таблиц, а не других, поэтому мне нужно было использовать эти аннотации. У меня есть отношения с внешним ключом для некоторых из моих неаудированных объектов от некоторых проверяемых объектов. Я часто использую аннотацию RelationTargetAuditMode.NOT_AUDITED, так что, по крайней мере, я проверяю значение/идентификатор внешнего ключа, а не сущность на другом конце отношения. Если у вас нет этой аннотации, вы получите исключение во время выполнения, когда ENVERS пытается вставить запись аудита в таблицу аудита для неаудированного объекта, и эта таблица не будет существовать. Я использую аннотацию NotAudited для нескольких взаимосвязей таблиц ManyToMany, которые мне просто не нужно проверять, и нет ничего в самой таблице проверенной сущности для записи (без идентификатора/значения внешнего ключа).

О да - документы не говорят, что происходит, если вы используете оба (не уверенный, какой из них имеет приоритет), но я не думаю, что использование обоих одновременно в данном поле предназначено. Используйте один или другой.

Ответ 2

Аудит целевого объекта и его отношений - это две разные вещи. Так что это зависит от того, что вам нужно. Из документация по Hibernate Envers - Easy Entity Auditing:

Если вы хотите провести аудит отношения, когда целевой объект не проверяется (например, со словарными объектами, которые не меняются и не подлежат аудиту), просто комментируйте его с помощью @Audited (targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Затем при чтении исторических версий вашей сущности отношение всегда будет указывать на "текущую" связанную сущность.