2011-11-03 85 views
0

我拿到這2個實體:JPA - 使用複合PK的和FK的和定義關係

@javax.persistence.Entity 
public class Book { 
    @javax.persistence.EmbeddedId 
    private BookPK id; 

    private String title; 

    @javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.LAZY) 
    @javax.persistence.JoinColumns({ 
      @javax.persistence.JoinColumn(name = "LNGCOD", referencedColumnName = "LNGCOD"), 
      @javax.persistence.JoinColumn(name = "LIBCOD", referencedColumnName = "LIBCOD") }) 
    private Language language; 
} 

@javax.persistence.Entity 
public class Language { 
    @javax.persistence.EmbeddedId 
    private LanguagePK id; 

    private String name; 
} 

與由PK的:

@Embeddable 
public class BookPK implements Serializable { 
    private Integer bookcod; 
    private Integer libcod; 
} 

@Embeddable 
public class LanguagePK implements Serializable { 
    private Integer lngcod; 
    private Integer libcod; 
} 

如果我嘗試創建一個新的圖書,並堅持它,我得到一個異常告訴我libcod在insert語句中找到兩次(「Column'libcod'指定了兩次」)。但是在定義JoinColumn時不能使用「insertable = false」(「在屬性中不允許插入和不可插入的列混合」)。

有什麼辦法來定義這些對象+關係,所以列由Hibernate自動管理? (我特別想到libcod)。

謝謝。

回答

1

創建第三個屬性「Integer libcod;」在書上。讓該屬性管理libcod的db狀態。對連接語言中的兩個屬性使用insertable = false,updatable = false。在你的「setLanguage」中設置private libcod = language.libcod。不要爲私有libcod公開getter/setter。

插入時是否生成任何值?我想這可能會使事情進一步複雜化。

+0

是的,這是我採用的解決方案,但我仍然希望有更優雅的東西。我想這將不得不做。 – ccc