【问题标题】:Difference using @Id and @EmbeddedId for a compound key使用 @Id 和 @EmbeddedId 作为复合键的区别
【发布时间】:2010-10-05 23:26:19
【问题描述】:

我创建了一个使用@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 注释有区别吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我参考了休眠文档Hiberate 3.5 annotations reference,区别在于@EmbeddedId 可以跳过注释实体类@Embeddable,但@Id 是必需的。

    我尝试在没有@Embeddable 的情况下使用@Id,但它给出了异常:

    org.hibernate.mapping.SimpleValue 不能转换为 org.hibernate.mapping.Component

    只有这个,没有像字段或类名这样的额外信息。

    这个行为是从 Hibernate 4 开始的;我不知道其他 JPA 提供商。如果有更多发现,我会测试一些并相应地更新帖子。

    【讨论】:

      【解决方案2】:

      我真的很惊讶 “之前” 版本可以正常工作。根据规范,映射Embeddable 复合键的正确方法是"after" 版本。引用 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 用作 主键字段或属性, 时间类型应指定为 日期。

      ...

      后来:

      9.1.14 EmbeddedId 注释

      应用了EmbeddedId 注释 到一个持久的字段或属性 实体类或映射超类 表示复合主键 是一个可嵌入的类。可嵌入的 类必须注释为 Embeddable.

      必须只有一个EmbeddedId 注释和没有 Id 注释时 使用了EmbeddedId 注解。

      【讨论】:

      • “Before”方法在“Java Persistence with Hibernate”一书中被列为使用复合主 ID 的 3 种方法中的第二种
      猜你喜欢
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2021-09-04
      • 2014-09-16
      相关资源
      最近更新 更多