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

时间:2011-11-03 13:26:43

标签: java hibernate jpa persistence

我有这两个实体:

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

如果我尝试创建一个新书并坚持下去,我会得到一个异常,告诉我在insert语句中找到了两次libcod(“Column'libcod'指定了两次”)。但是在定义JoinColumn时我不能使用“insertable = false”(“不允许在属性中混合可插入和不可插入的列”)。

有没有办法定义这些对象+关系,以便Hibernate自动管理列? (我特别想到libcod)。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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