【问题标题】:JPA - Using composite PK's and FK's and defining relationshipsJPA - 使用复合 PK 和 FK 并定义关系
【发布时间】:2011-12-21 04:39:41
【问题描述】:

我得到了这两个实体:

@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(“列 'libcod' 指定了两次”)。但是在定义 JoinColumn 时不能使用“insertable = false”(“不允许在属性中混合可插入和不可插入的列”)。

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

谢谢。

【问题讨论】:

    标签: java hibernate jpa persistence


    【解决方案1】:

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

    是否有任何值在插入时生成?我想这可能会使事情变得更加复杂。

    【讨论】:

    • 是的,这就是我采用的解决方案,但我仍然希望有更优雅的东西。我想这将不得不这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多