Я использую Hibernate-Envers 4.3.11 Final
Я вижу, что в документации написано:
Для правильной проверки таких отношений с Envers вы можете использовать аннотацию @AuditMappedBy,Это позволяет вам указать обратное свойство (используя элемент mappedBy).В случае индексированных коллекций столбец индекса также должен отображаться в ссылочной сущности (с использованием @Column (inserttable = false, updatable = false) и указываться с помощью positionMappedBy. Эта аннотация будет влиять только на работу Envers. Обратите внимание, чтоаннотация является экспериментальной и может измениться в будущем.
Что означают документы, когда в нем указано «указать обратное свойство» ?
У меня есть несколько сущностейкоторые имеют коллекции со ссылками ManyToOne и ManyToMany , и я хочу проверять сущности и их отношения и иметь возможность извлекать ревизии. Но я не могу пройти черезданные вплоть до коллекций дочерних сущностей, которые я извлекаю, так что я предполагаю, что не проверяю правильность отношений между сущностями?
Так что я думаю, что мне нужно использовать @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>();