2016-08-03 3 views
0

Ich bin JPA-Neuling und ich habe wahrscheinlich dumme Frage;)JPA - Klasse als Entität verwenden und gleichzeitig einbetten?

Lassen Sie Node eine Klasse sein, die einige Blogpost darstellt.

@Entity 
@Table(name="nodes") 
public class Node { 
    @Id 
    @GeneratedValue 
    private long id; 
    private String title; 
    private String body; 
} 

ich ein Archiv von gelöschten Knoten in separater Tabelle machen will (ich will nicht zu verwirren nodes Tabelle mit entfernten Knoten mit deleted Flag). Archiveintrag sollte zusätzliche Felder haben: DateTime deletedAt, String deletedBy und vielleicht noch etwas anderes.

Gibt es eine Möglichkeit, eine Klasse ArchivedNode in der folgenden Art und Weise zu machen:

@Table(name="archived_nodes") 
@Entity 
public class ArchivedNode { 
    private DateTime deletedAt; 
    private String deletedBy; 
    // ... 
    @Embedded 
    private Node node; 
} 

? Oder gibt es eine bessere Lösung für die Archivierung von Entitäten in separaten Tabellen?

+0

Sie können nicht direkt, da, wenn etwas eine Entität ist, dann hat es eine "ID" und ein eingebettetes Objekt nicht. Sie könnten einen Knoten haben, mit einem Embeddable, der zum Beispiel alle Felder des Knotens bereitstellt, und dann dieses einbettbare Objekt auch in ArchivedNode gespeichert haben. –

+0

Eclipselink unterstützt Soft Deletes und Verlaufstabellen https://wiki.eclipse.org/EclipseLink/Examples/JPA/SoftDelete https://wiki.eclipse.org/EclipseLink/Examples/JPA/History Andere Anbieter sollten etwas Ähnliches haben – Chris

Antwort

0

Erstellen Sie ein JPA-Repository für ArchivedNode. Jedes Mal, wenn Sie die Methode delete() auf einer Node aufrufen möchten, konvertieren Sie die Node, die Sie löschen möchten, in eine ArchivedNode und speichern Sie die ArchivedNode in der Tabelle archived_nodes.

Auch die Node innerhalb ArchivedNode sollte eine @OneToOne unidirektionale Beziehung sein.

... 
@OneToOne 
@JoinColumn(name="id") 
private Node node; 
... 
Verwandte Themen