Hibernate Envers ManyToMany обнаружение изменений - PullRequest
3 голосов
/ 20 февраля 2020

У меня есть объекты с однонаправленными отношениями ManyToMany. Документ может быть связан с несколькими объектами и несколькими этажами. Если документ обновляется, объекты и этажи, связанные с документом, должны создавать новую ревизию в envers по мере изменения коллекции. К сожалению, этого не происходит. Вопрос в том, как распространить изменения в дочернем объекте (документе) на сторону-владельца отношения многие ко многим (объект, этаж)?

Информация об используемых библиотеках:

  • ВЕСЕННЯЯ ЗАГРУЗКА 2.0.5.RELEASE
  • ДЕТАЛИ ВЕСНОЙ ЗАГРУЗКИ JPA 2.0.5.RELEASE
  • HIBERNATE 5.2.17.Final
  • HIBERNATE ENVERS 5.2.17.Final
@Entity
@Table(name = "facility")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Facility extends AbstractAuditingEntity implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes

    @ManyToMany
    @JoinTable(name = "facility_documents",
        joinColumns = @JoinColumn(name = "facilities_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "documents_id", referencedColumnName = "id"))
    @Audited(targetAuditMode = AUDITED)
    private Set<Document> documents = new HashSet<>();

    // getter + setter
}
@Entity
@Table(name = "floor")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Floor extends AbstractAuditingEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes

    @ManyToMany
    @JoinTable(name = "floor_documents",
        joinColumns = @JoinColumn(name = "floors_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "documents_id", referencedColumnName = "id"))
    @NotAudited
    private Set<Document> documents = new HashSet<>();

}
@Entity
@Table(name = "document")
@Audited(targetAuditMode = RelationTargetAuditMode.AUDITED)
public class Document extends AbstractAuditingEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    // more attributes, getters and setters but no ManyToMany Mapping to facility and floor

}

Следующие записи таблицы аудита envers записываются с использованием следующей процедуры:

1. СОСТОЯНИЕ: Создан объект + документ, обновлен объект, добавив в него документ

enter image description here

2. СОСТОЯНИЕ: удален документ

enter image description here Ожидается: новая редакция создана для объекта Фактическая: редакция не создана для объекта

3. СОСТОЯНИЕ: вручную обновленный объект

enter image description here

Если я сейчас получу текущий список изменений объекта, документ больше не будет в ревизии и будет помечены как удаленные из объекта. Это обновление должно произойти автоматически при изменении документа.

...