JPA - 使用复合PK的和FK的和定义关系

问题描述:

我拿到这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)。

谢谢。

创建第三个属性“Integer libcod;”在书上。让该属性管理libcod的db状态。对连接语言中的两个属性使用insertable = false,updatable = false。在你的“setLanguage”中设置private libcod = language.libcod。不要为私有libcod公开getter/setter。

插入时是否生成任何值?我想这可能会使事情进一步复杂化。

+0

是的,这是我采用的解决方案,但我仍然希望有更优雅的东西。我想这将不得不做。 – ccc