当前位置: 首页 > 面试题库 >

使用@Id和@EmbeddedId作为复合键的区别

刘元青
2023-03-14
问题内容

我创建了一个使用@Id指向@Embeddable复合键的实体。我认为一切正常。但是,据我所知,在将@Id切换为@EmbeddedId之后,一切仍然可以正常工作。

之前:

@Entity
public final class MyEntity {
    private CompoundKey id;

    @Id
    public CompoundKey getId() {
        return id;
    }

    public void setId(CompoundKey id) {
        this.id = id;
    }

后:

@Entity
public final class MyEntity {
    private CompoundKey id;

    @EmbeddedId
    public CompoundKey getId() {
        return id;
    }

    public void setId(CompoundKey id) {
        this.id = id;
    }

引用复合键时,使用@Id和@EmbeddedId批注之间有区别吗?


问题答案:

实际上,我对 “之前” 版本的工作感到惊讶。根据规范,映射您的Embeddable复合键的正确方法是 “之后” 版本。引用JPA
1.0规范:

2.1.4主键和实体身份

每个实体必须有一个主键。

必须在作为实体层次结构根目录的实体上或在实体层次结构的映射超类上定义主键。在实体层次结构中,主键必须定义一次。

一个简单的(即非复合的)主键必须对应于实体类的单个持久字段或属性。 该Id注释被用来表示一个简单的主键。 请参阅第9.1.8节。

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

主键(或复合主键的字段或属性)应为以下类型之一:任何Java原语类型;任何原始包装器类型;java.lang.String;
java.util.Date;
java.sql.Date。但是,一般来说,近似数字类型(例如浮点类型)绝对不能在主键中使用。主键使用其他类型的实体将不可移植。如果使用生成的主键,则仅整数类型是可移植的。如果java.util.Date用作主键字段或属性,则应将时间类型指定为DATE。

然后:

9.1.14 EmbeddedId注释

EmbeddedId注释被施加到一个实体类的持久字段或属性或映射超表示一个复合主密钥是一个可嵌入类。可嵌入类的注释必须为
Embeddable

使用EmbeddedId 注释时,只能有一个注释,没有Id注释EmbeddedId



 类似资料:
  • 问题内容: 如何使用复合主键作为外键?看来我的尝试无效。 问题答案: 该行: 是错的。您不能那样使用,这只是父表中PK约束的名称。要将复合主键用作外键,您必须向子表中添加相同数量(组成PK)的相同数据类型的列,然后在定义中使用这些列的组合:

  • 如何将复合主键用作外键?看来我的尝试没有成功。

  • 在每分钟有1000个条目(惟一键)进入cosmos的场景中,使用/id作为分区键安全吗? 特别是,有逻辑分区的概念https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data这里的图形让我有点害怕,显示逻辑分区是实际实体(例如“城市”:“伦敦”)。如果我有一个8小时的TTL和每分钟1000个条目,我不一定需要cosmos需要管理的4

  • 问题内容: 这是我的两个关注表: 我想在“组”中创建一个字段,该字段将链接到“教程”中的复合唯一键。所以我想我的问题是,如何关联这些表?我必须为“教程”中的每个主键在“组”中创建外键字段吗? 问题答案: 根据mySQL文档,您应该能够设置到组合的外键映射,这将要求您创建多个列。 添加列并将其放在表格中 正如史蒂文(Steven)在以下注释中提到的那样,您应该尝试重新构造它,以便教程表使用实际的主键

  • 请求表是这样注释的。 接下来,我有一个包含请求id和注释id表的联接表 现在我有了笔记表,它是普通表。它有自己的@SequenceGenerator 现在,从用户界面,用户可以改变,添加或删除备注的请求。 当我从UI添加新的Note时,我有以下代码。在这里,我已经有了请求Id,但是Notes Id必须生成并保存到Join table(request_note)表,我得到了错误。 我现在的问题或错误