В чем разница между @NotAudited и RelationTargetAuditMode.NOT_AUDITED в Hibernate EnVers? - PullRequest
48 голосов
/ 14 апреля 2011
@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

Зачем использовать оба?хорошо ли использовать оба или одного будет достаточно?

Ответы [ 3 ]

44 голосов
/ 08 июля 2016

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

Вы также можете применить RelationTargetAuditMode ко всему классу, что, как я считаю, просто говорит, что для всех отношений в классе не проверяется другой конец. Это смутило меня, так как я по ошибке использовал эту аннотацию для обозначения «не проверять сущность ниже», что не означает. Просто не используйте аннотацию Audit для класса сущности вообще, если вы не хотите, чтобы сущность проверялась. В других проверенных объектах, которые ссылаются на объект, вам придется либо использовать 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, которые мне просто не нужно проверять, и в самой таблице проверяемого объекта нет ничего для записи (без идентификатора / значения внешнего ключа).

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

38 голосов
/ 22 апреля 2011

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

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

1 голос
/ 27 июня 2018

@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) имеет только одно применение: если у вас есть проверяемая сущность, владеющая отношением к неаудируемой сущности, и вы хотите получить в данных аудита информацию об идентификаторе неаудируемой сущности.Допустим, что CustomerBooking проверяется, а класс отеля не проверяется.У вас есть два варианта для поля Hotel: @NotAudited (в этом случае у вас вообще не будет информации об отеле в исторических данных) или @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), и в этом случае вы всегда будете иметь самое последнее состояние Hotel в данных аудита.Обратите внимание, что в случае проверки отеля RelationTargetAuditMode.NOT_AUDITED будет просто проигнорировано (у вас будут исторические данные для отеля).@NotAudited означает «Мне просто плевать на это поле в исторических данных» (оно не будет сохранено, отношение будет нулевым, вы не увидите его при просмотре исторических данных о CustomerBooking)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...