0

Gegeben eine Entität, die von Envers geprüft wird, die eine Auflistung enthält.Hibernate Enver: @AuditJoinTable Zeilen fehlen

Entity A

@Audited 
    public class A{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    .... 
    @OneToMany 
    @JoinColumn(name = "a_id") 
    @AuditJoinTable(name = "A_B_AUDIT" 
      ,inverseJoinColumns = @JoinColumn(name = "a")) 
    private List<B> bs; 
    .... 
} 

Entity B

@Audited 
public class B{ 
@Id 
private int id; 
.... 
@Column(name = "a_id") 
private int aId; 

@ManyToOne 
@JoinColumn(name = "a_id", insertable = false, updatable = false) 
private A a; 
} 

nach ihren documentation Envers speichert die Prüfinformationen für Additionen und Deletionen an diese AuditJoinTables (A_B_AUDIT). Aber leider funktioniert das nicht und die Zeilen in den Tabellen fehlen.

Als ich betreiben mein Projekt folgenden Tabellen erstellt wird:

A_AUDIT

B_AUDIT

A_B_AUDIT

Ich habe getrennte Regler Ein Objekt und B Objekt zu bestehen. Wenn ich versuche, B mit aId und A zu speichern, wird audit_table (A_B_AUDIT) nicht aktualisiert, aber B_AUDIT mit aktualisierter Revision wird aktualisiert.

Kann mir bitte jemand sagen, was ich hier vermisse.

Vielen Dank !!

Hibernate Enver Version: 5.1.4.Final

+0

Ich habe sowohl mit Master und 5.1.4 getestet und ich kann Ihr Problem nicht reproduzieren, so dass es etwas sehr Spezifisches mit der Einstellung der Werte auf beiden Seiten der Beziehung sein muss. Könnten Sie Ihren Code dort einfügen, wo Sie Ihre Entitäten erstellen und zuordnen, bevor Sie fortfahren? – Naros

+0

Hallo @Naros, ich habe separate Controller für beide und auf der Basis von aId mapping (Hibernate) wähle ich die Assoziationen. –

+0

Es hört sich so an, als würden Sie 'B' und' A' in separaten Transaktionen beibehalten und die einzige Verbindung, die Sie zwischen ihnen aufbauen, ist 'B # aId' mit der Kennung' A'. Wenn das wahr ist und Sie nicht auch 'B' explizit zu der Liste in' A' hinzufügen, dann werden Sie am Ende keine Werte in der Join-Tabelle platzieren. So funktioniert Persistenz nicht. Sie müssen sicherstellen, dass Sie alle erforderlichen Attribute zusammen beibehalten, sonst erhalten Sie einen Teilstatus und Envers füllt den Überwachungsverlauf nicht korrekt auf. Wenn dies nicht das ist, was Sie tun, müssen Sie den eigentlichen Code erneut posten. – Naros

Antwort

1

Wie in den Kommentaren gesagt, Ihr Problem ist, dass Sie die Persistenz dieser beiden Entitäten in separaten Transaktionen Leistung erbringt, aber sie machen nicht die richtige Assoziation und damit den Status von Hibernate's First Level Cache. Versehentlich verursachen Sie auch, dass Envers Ihre Entitäten nicht ordnungsgemäß auditieren können, weil Sie nicht den richtigen Status angeben.

für diesen Anwendungsfall Um mit Envers zu arbeiten, müssen Sie ändern, wie Sie die Ausdauer Ihrer Entity B gegeben Umgang mit, dass es das einzige ist, das weiß über die Beziehung mit Entity A-scheint.

Während der Persistenz von Entity B, sollten Sie dies wahrscheinlich tun:

if (b.getAId() != null) { 
    A a = entityManager.find(A.class, b.getAId()); 
    a.getBs().add(b); 
    a = entityManager.merge(a); 

    b.setA(a); 
    entityManager.persist(b); 
} 

Dies wurde während der Persistenz von Entity bedeutet B, sollten Sie eine Prüfung Zeile in der Prüfung hinzugefügt bekommen Tisch sitzen, wie Sie und die erwartete Status im Hibernate-Cache der ersten Ebene enthält alle korrekten Verweise zwischen den beiden Entitäten.

Wenn wir Envers beiseite für einen Moment und Fokus auf normaler JPA-Provider-Nutzung, sollten Sie in der Lage sein, dies zu tun, nachdem Sie B bestehen bleiben und es funktionieren würde:

final A theA = b.getA(); 
assertNotNull(theA); 
assertTrue(!theA.getBs().isEmpty()); 
assertTrue(theA.getBs().contains(b)); 

Natürlich, wenn Sie nicht setzen die Assoziationen, diese Behauptungen (die alle bestehen sollten) werden nicht.Die einzige Zeit, die sie passieren würden, wäre, wenn Sie die Entity B requery, aber das sollte nicht notwendig sein.

Hoffentlich verstehen Sie.

Verwandte Themen