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

dig*_*nie 18 java hibernate

我创建了一个使用@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;
    }
Run Code Online (Sandbox Code Playgroud)

后:

@Entity
public final class MyEntity {
    private CompoundKey id;

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

    public void setId(CompoundKey id) {
        this.id = id;
    }
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 28

我真的很惊讶"之前"版本正在运行.根据规范,映射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.

  • “使用Java持久性与Hibernate”一书中列出了“之前”方法,这是使用复合主ID的3种方法中的第二种。 (3认同)

bab*_*ira 14

这个答案为时已晚,但万一有所帮助.

我提到了hibernate docs Hiberate 3.5注释引用,其中有不同之处在于@EmbeddedId你可以跳过注释实体类@Embeddable@Id需要它.

我尝试使用@Id没有@Embeddable它给出例外:

org.hibernate.mapping.SimpleValue无法强制转换为org.hibernate.mapping.Component

就是这个,没有像字段或类名这样的额外信息.

那么这个行为就像Hibernate 4一样; 我不知道其他JPA提供商.如果有更多的发现,我会测试一些并相应地更新帖子.

我希望这可以帮助别人!