2016-04-01 144 views
0

我有兩個表:Word和Stems。第二個字段是Word的外鍵。這麼多的詞幹可以屬於一個詞。休眠,間接關係映射

在Java中,我創建了Entities Word和Stem。因爲單詞可以有很多詞幹,而且我在這個詞幹的列表上有一些操作,所以我決定把這個列表與對應的方法放在單獨的名爲Stems的類中。這個類的對象是在Word實體中。下面我介紹我的代碼看起來像:


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; 
} 

這裏來了我的問題。是否有可能使HQL查詢獲得正確的詞幹?如果沒有那麼如何實現這一點。也許這個結構不允許工作?如何添加/更新詞幹?我嘗試在每個詞幹中設置單詞和單詞id中的詞幹數組,然後使用session.merge(單詞),但它不起作用。

回答

0

我看到了燈光。我想在這裏粘貼完整的解決方案來解決我的問題。該解決方案允許僅通過調用包含詞幹列表的詞對象的session.merge來修改詞幹表。

普萊斯注意到@OneToMany註釋@Embedded註釋@Embeddable和參數orphanRemoval


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 - 沒有變化。