2016-04-01 1 views
0

Ich habe zwei Tabellen: Word und Stems. Die zweite hat Feld, das ein Fremdschlüssel für Word ist. So viele Stämme können zu einem Wort gehören.Hibernate, indirekte Beziehungen Zuordnung

In Java habe ich Entities Word und Stem erstellt. Da das Wort viele Stiele haben kann und ich einige Operationen auf der Liste dieser Stiele habe, entscheide ich, diese Liste mit der entsprechenden Methode in die separate Klasse Stems zu schreiben. Objekt dieser Klasse ist in Word-Entität. Im Folgenden stelle ich, wie mein Code wie folgt aussieht:


Word.java

@Entity 
@Table(name = "Word") 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Word implements Serializable{ 

    // primary key and other columns 

    @Transient 
    protected Stems stems = new Stems(); 

    public void setStems(List<Stem> stems) { 
     this.stems.setStems(stems); 
    } 

    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word") 
    public List<Stem> getStems() { 
     return stems.getStems(); 
    } 
} 

Stems.java

public class Stems { 

    private List<Stem> stems = new ArrayList<>(); 

    public List<Stem> getStems() { 
     return stems; 
    } 

    public void setStems(List<Stem> stems) { 
     this.stems = stems; 
    } 
} 

Stem.java

@Entity 
@Table(name = "Stems") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="Type",discriminatorType=DiscriminatorType.STRING) 
public abstract class Stem implements Cloneable{ 

    @Id 
    @Column(name = "Stem", unique = true, nullable = false, length = 64) 
    private String rawStem; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "WordId", nullable = false) 
    private Word word; 
} 

Und hier kommen meine Fragen. Ist es möglich, eine HQL-Abfrage zu machen, um ein Wort mit korrekten Stielen zu erhalten? Wenn nein, wie erreichen Sie das. Vielleicht darf diese Struktur nicht funktionieren? Wie kann ich Wörter mit Stämmen hinzufügen/aktualisieren? Ich habe versucht, Array von Stämmen in Word und Word-ID in jedem Stamm und dann session.merge (Wort) verwenden, aber es funktioniert nicht.

Antwort

0

Ich sah das Licht. Ich möchte hier eine vollständige Lösung für mein Problem einfügen. Diese Lösung ermöglicht es, die Tabelle Stems nur durch Aufrufen von session.merge für ein Wortobjekt zu ändern, das eine Liste von Stämmen enthält.

Pleas beachten Anmerkungen @Embedded, @Embeddable und Parameter orphanRemoval in @OneToMany Anmerkung.


Word.java

@Entity 
@Table(name = "Word") 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Word implements Serializable{ 

    // primary key and other columns 

    @Embedded 
    protected Stems stems = new Stems(); 

    public List<Stem> getStems() { 
     return stems.getStems(); 
    } 

    public void setStems(List<Stem> stems) { 
     this.stems.setStems(stems); 
    } 
} 

Stems.java

@Embeddable 
public class Stems { 
    // orphanRemoval removes stems which is present in database but not on list 
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="word", orphanRemoval = true) 
    private List<Stem> stems = new ArrayList<>(); 

    // getters/setters 
} 

Stem.java - keine Änderungen.