当前位置: 首页 > 知识库问答 >
问题:

Hibernate/JPA:将父项中的部分复合主键同时用作子项中的外键和主键

广亮
2023-03-14

我有2个实体类:Student是父类,Address是子类,具有一对一映射:

student_id int(pk),roll_no int(pk),name varchar

student_id(pk,fk),国家/地区varchar

address实体中的student_id既是主键也是外键

学生实体类:

@Entity
@Table(name = "student")
public class Student {

    @EmbeddedId
    private StudentPrimaryKey studentPrimaryKey;

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

    @OneToOne(mappedBy = "student", cascade = CascadeType.ALL)
    private Address address;
    ........
@Embeddable
public class StudentPrimaryKey implements Serializable{

    @Column(name = "student_id")
    private long id;

    @Column(name = "roll_no")
    private long rollNo;
    ....
@Entity
@Table(name = "address")
public class Address {

    @Id
    @Column(name  = "student_id")
    private long id;

    @Column(name  = "country")
    private String country;

    @OneToOne
    @JoinColumn(name = "student_id")
    @MapsId
    private Student student;
    .......

异常为-org.hibernate.AnnotationException:@mapsid映射中的隐式列引用失败,请尝试使用显式referenceColumnNames

我知道父表中有两个主键列,@mapsid无法确定应该将外键映射到父表中的哪一个,所以我尝试在Address Entity中使用referencedColumnName-

@OneToOne
    @JoinColumn(name = "student_id", referencedColumnName = "student_id")
    @MapsId
    private Student student; 

新异常:在@mapsid映射中找不到列引用:roll_no

这是一个存在相同问题的链接,即JPA/hibernate不允许部分复合主键作为外键。

请提供您的支持,帮助我处理这件事。

共有1个答案

酆茂才
2023-03-14

如果student只能通过其IDrollno的组合来唯一标识,则相应的address也需要其主键/外键中的这两个字段,并且应该如下所示(注意,它使用相同的@embeddedidstudentprimarykey):

@Entity
@Table(name = "address")
public class Address {

    @EmbeddedId
    private StudentPrimaryKey primaryKey;

    @MapsId
    @JoinColumns({
        @JoinColumn(name="student_id", referencedColumnName="student_id"),
        @JoinColumn(name="roll_no", referencedColumnName="roll_no") })
    @OneToOne
    Student student;

    @Column(name  = "country")
    private String country;

    ...

您还需要将roll_no列添加到address表中。

如果student可以通过其ID唯一标识(正如您的address映射所暗示的),则可以从主键中删除rollno并在ID上使用简单的@id映射和在rollno上使用@basic映射。

 类似资料:
  • 我的数据库是: 我们可以在Table2中为Table1中的1设置多行。 我的TABLE1实体是: 我的Table1Id类是: 我的TABLE2实体是: 我的Table2Id类是: 当我尝试启动我的tomcat时,我有以下错误: 我尝试使用引用列,主键连接列和许多其他东西,但是通过在互联网上阅读它,它可以解决数据库建模问题。我认为问题是主键和外键在2个表中具有相同的名称,但我可能是错的......我

  • 我有以下表格,如何将它们映射到JPA实体: 事件表与会议表具有一对多的关系。我如何在JPA中映射这种双向关系?

  • 我有一个这样的实体: 多谢了,安德里亚

  • 在我的jpa映射中,我试图将带有一个主键的父类映射到带有复合键的子类,但似乎插入了错误的表,它已经生成了2个表,但不幸的是我没有绑定外键(policy_value_summary_id) 我试图用策略值(子类)保存策略摘要值(父),如下所示 下面是输出给我的错误

  • 问题内容: 我试图弄清楚如何构建JPA实体bean,以使数据适用于我的设备。该数据库是旧的,一成不变的,所以我不能更改架构。设备模型具有复合主键,其中的一列是设备类型的FK。 我尝试了几种不同的方法。首先是设备具有DeviceModel和DeviceType,但是这给了我一个错误,那就是太多的东西在引用dev_type。因此,然后我尝试让DeviceModel引用DeviceType,但遇到了相同

  • 问题内容: 我必须使用hibernate模式,并且不太确定如何解决此问题,我有2个具有1..n关系的表,如下所示: 我该如何使用Hibernate进行管理??? 我不知道如何管理第二张表的主键… 问题答案: 在Hibernate参考文档中有一个与您的案例完全相似的示例。在此示例之前,您将找到解释。这是与您的问题匹配的示例(用户是表A,客户是表B): 注意:如果您拥有这两个表的代理标识符,则要简单得