【问题标题】:Hibernate many to one mapping using one column which is in primary composite keys使用主复合键中的一列休眠多对一映射
【发布时间】:2017-07-13 09:06:56
【问题描述】:

我现在正在尝试使用 hibernate 从 mysql 数据库中检索数据。但是,我遇到了 org.hibernate.AnnotationException,它提醒我不能使用单个属性。我的代码如下,请看一下。

@Entity
@Table(name = "master")
public class Master implements Serializable {
    @EmbeddedId
    private MasterPK id;

    @Column
    private String description;

    @Column
    private String username;

    @Column
    private String emailaddress;

    ....

    @OneToMany(mappedBy = "master")
    @LazyCollection(LazyCollectionOption.FALSE)
    private List<Child> childs;

    ....
    // Getter and setter
}


@Entity
@Table(name = "child")
public class Child implements Serializable {

    ....

    @Column
    private String code;

    @Column
    private String isGolden;

    @Column
    private Date startServiceDate;

    @Column
    private Date endServiceDate;

    @ManyToOne
    @JoinColumn(name="id_a", referencedColumnName="id_a")
    private Master master;

    ....
    // Getter and setter

}


@Embeddable
public class MasterPK implements Serializable {

    @Column(name="id_a")
    private String idA;

    @Column(name="id_b")
    private String idB;

    ...  
    //Classes generated by JPA Tools e.g. getter, setter, comparator
}

我尝试使用 master.id_a 和 child.id_a 映射主表和子表,而 id_a 和 id_b 是主表的主键。因此,休眠引发了异常,我无法启动我的应用程序。但是我仍然想通过 id_a 映射两个表,因为子表没有 id_b。并且设计是主表中的每一行都可以映射到多个子表。我可以对这种情况提出一些建议吗?非常感谢!

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    在我看来,您“交换”了实体,即您定义的复合 pk 似乎实际上是典型子表的主键。 您可以发布实际表的架构吗?这可能会有所帮助

    【讨论】:

    • 感谢您的帮助。我已经更新了我的代码。实际上,子表只是存储主表中额外细节的扩展表之一
    • 并且主表和子表只共享FK id_a。主表使用 id_a 和 id_b 作为主键(id_a 也是唯一的,但需要结合 id_b 作为主键用于其他目的,不能更改表)。子表只有 id_a 列。
    • 对不起,我对这种设计感到很困惑,当单独id_a 是一个好的 pk 时,将 id_a 和 id_b 组合为主表中的 pk 的目的是什么?无论如何,休眠的问题是子实体必须引用主主键的所有列,而不仅仅是id_a
    猜你喜欢
    • 2014-08-20
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多