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

复合主键一对一双向映射

祁高格
2023-03-14

共有1个答案

彭飞虎
2023-03-14

您可以使用@embeddable映射两个实体的复合主键,并在User实体的address属性上使用@mapsid注释来共享主键。

但是在向您展示映射之前,请注意user在大多数数据库中是一个保留字。我建议您为实体选择一个不同的名称。在我的示例中,我将其更改为person

让我们从映射主键的@embeddable开始。我将该类命名为AddressKey。它是一个实现serializable接口的简单Java类,具有xidyid属性。您还需要实现equalshashcode方法。

@Embeddable
public class AddressKey implements Serializable {

    private Long xId;
    private Long yId;

    public AddressKey() {}

    public AddressKey(Long xId, Long yId) {
        this.xId = xId;
        this.yId = yId;
    }

    // omit getter and setter for readability

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((xId == null) ? 0 : xId.hashCode());
        result = prime * result + ((yId == null) ? 0 : yId.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        AddressKey other = (AddressKey) obj;
        if (xId == null) {
            if (other.xId != null)
                return false;
        } else if (!xId.equals(other.xId))
            return false;
        if (yId == null) {
            if (other.yId != null)
                return false;
        } else if (!yId.equals(other.yId))
            return false;
        return true;
    }
}
@Entity
public class Address {

    @EmbeddedId
    private AddressKey id;

    private String city;

    private String street;

    private String country;

    @OneToOne(mappedBy = "address")
    private Person person;

    // omit getter and setter methods
}

Person实体的映射看起来类似。除了主键映射之外,还需要用@mapsid注释address属性,该属性将关联映射到person实体。它告诉Hibernate它将使用关联的address实体的主键作为person实体的主键。

您还需要用2个@JoinColumn注释来注释Address属性,以便将外键映射到Person表的XIDYID列。如果没有这些注释,Hibernate会将它们映射到列address_xidaddress_yid

@Entity
public class Person {

    @EmbeddedId
    private AddressKey id;

    private String name;

    private String society;

    @OneToOne
    @JoinColumn(name="xId", referencedColumnName="xId")
    @JoinColumn(name="yId", referencedColumnName="yId")
    @MapsId
    private Address address;

    // omit getter and setter methods for readability
}
 类似资料:
  • 我试图在Hibernate中的两个表之间创建一对一的单向主键关系。我使用xml Maaping,下面是我的java POJO类和它们各自的。hbm文件。 储物柜POJO类 locker.hbm.xml 下面是我用来保存student和locker对象的主类。

  • 我正在努力解决hibernate映射问题,即在订单表的主键和带有一些额外列的产品购物车的复合键之间映射一对多关系 产品购物车表具有组合键购物车ID和产品ID 我试着跟踪但没有成功 有人能帮我实现这一点吗?下面是错误消息 原因:组织。冬眠AnnotationException:非法尝试使用mappedBy关联pcoPK定义@JoinColumn。组织pk。冬眠cfg公司。Ejb3JoinColumn

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

  • 在child_tableparent_id列作为外键和复合主键的一部分。 Embedded类内部无法使用标识生成器。所以我在这里使用ID类。为child_id列生成自动增量值。 我无法将parent_table生成parent_id值作为外键值存储在child_table中,它存储为0。 有人能检查一下地图吗?帮帮我…… 提前致谢...

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • notification_detail-单个主键 我想使用JPA持久化和读取这些对象,但无法使ManyToOne映射工作。 许多通知映射到一个notification_detail。 我试过所有类型的不同配置。我能想到的最好的办法是,我的情况很复杂,因为父对象“notification_detail_id”有一个复合键“notification_detail_id”,它也是子对象的主键。这使得Hi

  • 我想查询使用hibernate通过内连接连接的两个表。 以下是两个表格。 创建表(INT(20)非空AUTO_INCREMENT,VARCHAR(50)非空默认'0',主键() ) 创建表(INT(20)非空,INT(20)非空默认值“0”,主键(),约束外键()引用) 这两个表具有一对多关系。 这些束的豆类如下。 但我在说 “……构造函数引发异常;嵌套异常为org.hibernate.Mappi

  • 问题内容: 我在这里搜索,但未找到任何类似的主题,因此我发布了一个新问题。 我正在使用现有数据库上的Hibernate。我们不允许更改表的结构和数据。该应用程序正在从数据库读取数据,并根据某种逻辑迁移到另一个数据存储。 现在的问题是关于复合PK映射。例如 表A具有复合PK。 表B也有一个复合PK,此复合PK的一部分是A的PK,此处也用作FK。 我尝试了几种方法,但都无济于事。谁能告诉一个有效的Hi