6 Stimmen

JPA - "versionierte" Entität, Gestaltungshinweise erforderlich

Stellen Sie sich die folgenden zwei Einheiten vor. Element ist eine einfache Klasse, die einige Daten enthält:

@Entity
public class Element {
    private String data;

    public String getData() { return data; }    
    public void setData(String data) { this.data = data; }
}

Nächste Klasse, genannt VersionedElement , erweitert Element und enthält verschiedene Versionen zusammen mit der aktuellen Version. Hier ist meine "Lösung":

@Entity
public class VersionedElement extends Element {
    private Set<Element> versions;
    private Element currentVersion;

    @Override
    public String getData() {
        return getCurrentVersion().getData();
    }

    @Override
    public void setData(String data) {
        getCurrentVersion().setData(data);
    }

    @OneToMany
    public Set<Element> getVersions() {
        return versions;
    }

    public void setVersions(Set<Element> versions) {
        this.versions = versions;
    }

    @ManyToOne
    public Element getCurrentVersion() {
        return currentVersion;
    }

    public void setCurrentVersion(Element currentVersion) {
        this.currentVersion = currentVersion;
    }
}

Und mir gefällt nicht, was ich geschrieben habe, irgendetwas stimmt da nicht, ein zu geradliniger Ansatz. Zunächst einmal, in der letzten Klasse currentVersion ist nicht begrenzt durch und hat keine Beziehung zu versions . Es sieht so aus, als ob dem Code einige Hilfsklassen, eine Abstraktionsebene, eine JPA-Annotationstechnik oder alles zusammen fehlen. Ich brauche eine elegante, der JPA-Handbuchlösung würdige Lösung für diesen einfachen Fall. Für Hinweise, Links oder Codeschnipsel wäre ich dankbar.

-1voto

AmanicA Punkte 4283

Sie könnten einfach einen Verweis auf die letzte Entität in einer separaten Tabelle (mit einer Zeile) speichern. Etwa so:

@Entity
public class CurrentElement {

    @OneToOne        
    private Element currentVersion;

    public static Element getCurrentVersion(EntityManager em) {
         return em.createQuery("select x from Element x ").getSingleResult().currentVersion;
    }

    public static void setCurrentVersion(EntityManager em, Element newVersion) {
         em.remove(getCurrentVersion(em));
         CurrentElement ce = new CurrentElement();
         ce.currentVersion = newVersion;
         em.persist(ce);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X