Я использую Hibernate-Envers 4.3.11 Final.
Я вижу, что в документации сказано:
To properly audit such relations with Envers, you can use the @AuditMappedBy annotation. It enables you to specify the reverse property (using the mappedBy element). In case of indexed collections, the index column must also be mapped in the referenced entity (using @Column( insertable=false, updatable=false ), and specified using positionMappedBy. This annotation will affect only the way Envers works. Please note that the annotation is experimental and may change in the future.
Что означает документация, когда написано "указать обратное свойство"?
У меня есть несколько сущностей, у которых есть коллекции со ссылками многие к одному и многие ко многим, и я хочу проверить сущности и их отношения и иметь возможность получать ревизии. Но я не могу пройтись по данным до коллекций дочерних сущностей, которые я извлекаю, поэтому я предполагаю, что неправильно проверяю отношения между сущностями?
Поэтому я думаю, что мне нужно использовать @AuditMappedBy().
Но я запутался, потому что независимо от того, использую ли я @AuditMappedBy(MappedBy = "NAME") в столбцах, которые являются коллекциями, или @audited в верхней части моих сущностей, я вижу те же результаты в таблицах аудита и в данных, когда я извлекаю свои сущности. Мне еще предстоит понять, почему я буду использовать @AuditMappedBy().
Может ли кто-нибудь помочь мне понять вариант использования @AuditMappedBy()?
Пример иерархии таблиц и того, как мне нужно перейти к коллекциям в дочерних таблицах:
**TABLE A:**
@Entity()
@Audited
@Table(name = "TABLE_A")
@Column(name = "ID")
private Long id;
@Column(name = "NAME", length = 50)
private String name;
@OneToMany(
mappedBy = "table_a",
cascade = {CascadeType.MERGE, CascadeType.PERSIST}
)
@org.hibernate.annotations.Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN}
)
private Collection<TABLE_B> table_b = new ArrayList<TABLE_B>();
**TABLE B:**
@Entity()
@Audited
@Table(name = "TABLE_B")
@Column(name = "ID")
private Long id;
@Column(name = "NAME", length = 50)
private String name;
@XmlTransient
@ManyToOne()
@JoinColumn(name = "ID_TABLE_B", nullable = false)
private TABLE_A table_a;
@ManyToOne(
cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@org.hibernate.annotations.Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE}
)
@JoinColumn(name = "ID_TABLE_C")
private TABLE_C table_c;
@ManyToOne(
cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@org.hibernate.annotations.Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE}
)
@JoinColumn(name = "ID_TABLE_D", nullable = true)
private TABLE_D table_d;
**TABLE C:**
@Entity()
@Audited
@Table(name = "TABLE_C")
@Column(name = "ID")
private Long id;
@Column(name = "NAME", length = 50)
private String name;
@OneToMany(
mappedBy = "table_c",
cascade = {
CascadeType.REMOVE})
@org.hibernate.annotations.Cascade(
{org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN}
)
@XmlTransient
private Collection<TABLE_B> table_b = new HashSet<TABLE_B>();
**TABLE D:**
@Entity()
@Audited
@Table(name = "TABLE_D")
@Column(name = "ID")
private Long id;
@Column(name = "NAME", length = 50)
private String name;
@XmlTransient
@OneToMany(
mappedBy = "table_d",
cascade = {CascadeType.MERGE, CascadeType.PERSIST}
)
private Collection<TABLE_B> table_b = new ArrayList<TABLE_B>();





Можете ли вы обновить свой пост, чтобы указать версию Envers и пример сопоставления сущностей, где обход не работает для вас?
AuditMappedByне всегда необходим, и это немного зависит от ваших вариантов использования.