栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用JPA和Hibernate映射组合键?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用JPA和Hibernate映射组合键?

要映射组合键,你可以使用

EmbeddedId
或在
IdClass
注解。我知道这个问题不仅仅涉及
JPA
,但规范定义的规则也适用。因此,它们是:

2.1.4主键和实体身份

组合主键必须对应于单个持久性字段或属性,或者对应于如下所述的一组此类字段或属性。必须定义一个主键类来表示一个复合主键。当数据库密钥由几列组成时,从传统数据库进行映射时,通常会出现复合主键。的EmbeddedId和 IdClass注解用于表示复合主键。参见9.1.14和9.1.15节。

以下规则适用于复合主键:

  • 主键类必须是公共的,并且必须具有公共的无参数构造函数。
  • 如果使用基于属性的访问,则主键类的属性必须是公共的或受保护的。
  • 主键类必须为serializable。
  • 主键类必须定义equals和hashCode 方法。这些方法的值相等的语义必须与键映射到的数据库类型的数据库相等一致。
  • 复合主键必须表示并映射为可嵌入类(请参见第9.1.14节“ EmbeddedId注释”),或者必须表示并映射至实体类的多个字段或属性(请参见第9.1.15节“ IdClass”)注解”)。
  • 如果组合主键类映射到实体类的多个字段或属性,则主键类中的主键字段或属性的名称与实体类的名称必须对应,并且它们的类型必须相同。
    带着 IdClass
    复合主键的类可能看起来像(可以是静态内部类):

public class TimePK implements Serializable {    protected Integer levelStation;    protected Integer confPathID;    public TimePK() {}    public TimePK(Integer levelStation, Integer confPathID) {        this.levelStation = levelStation;        this.confPathID = confPathID;    }    // equals, hashCode}

和实体:

@Entity@IdClass(TimePK.class)class Time implements Serializable {    @Id    private Integer levelStation;    @Id    private Integer confPathID;    private String src;    private String dst;    private Integer distance;    private Integer price;    // getters, setters}

该IdClass注释映射多个字段的表PK。

用 EmbeddedId

复合主键的类可能看起来像(可以是静态内部类):

@Embeddablepublic class TimePK implements Serializable {    protected Integer levelStation;    protected Integer confPathID;    public TimePK() {}    public TimePK(Integer levelStation, Integer confPathID) {        this.levelStation = levelStation;        this.confPathID = confPathID;    }    // equals, hashCode}

和实体:

@Entityclass Time implements Serializable {    @EmbeddedId    private TimePK timePK;    private String src;    private String dst;    private Integer distance;    private Integer price;    //...}

该@EmbeddedId注解映射一个PK类表PK。

差异:* 从物理模型的角度来看,没有区别*

@EmbeddedId
通过某种方式可以更清楚地传达出该密钥是组合密钥,而当组合的pk* 本身是有意义的实体或在代码中重用时,IMO便有意义。*
IdClass
用来指定某些字段组合是唯一的,但这些字段没有特殊含义。

它们还会影响您编写查询的方式(使查询或多或少变得冗长):

  • 与 IdClass
select t.levelStation from Time t
  • 与 EmbeddedId
select t.timePK.levelStation from Time t

参考文献* JPA 1.0规范* 第2.1.4节“主键和实体标识”* 第9.1.14节“ EmbeddedId注释”* 第9.1.15节“ IdClass注释”



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号