【问题标题】:Super simple composite key without @EmbeddedId or @IdClass没有@EmbeddedId 或@IdClass 的超级简单复合键
【发布时间】:2013-09-25 15:51:23
【问题描述】:

我不知道什么时候可以做到这一点,但我只是按照我一直想要的方式创建了复合键:不需要@EmbeddedId,也不需要@IdClass!!

  • 弹簧 4.0.0.M3
  • 休眠 4.3.0.Beta4
  • JPA 2.1

User.java

@Entity
public class User {
    @Id
    ...

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<GroupUser> groupUsers;     
}

Group.java

@Entity
public class Group {
    @Id
    ...

    @OneToMany(mappedBy="user", cascade=CascadeType.ALL, orphanRemoval=true)
    private List<GroupUser> groupUsers;     
}

GroupUser.java

@Entity
public class GroupUser implements Serializable {
    @Id
    @ManyToOne
    @JoinColumn(name="Group_id")
    private Group group;

    @Id
    @ManyToOne
    @JoinColumn(name="User_id")
    private User user;

    @Id
    @Column
    private String s;

    @Column
    private int i;
}

这就是 MySQL 所说的:

 USER             GROUP_USER            GROUP
------    -------------------------    -------
 id        User_id  (PK, NOT NULL)       id 
           Group_id (PK, NOT NULL)
           s        (PK, NOT NULL)
           i        (DEFAULT NULL)

GROUP_USER详情:

  • 主键:User_id、Group_id、s
  • 索引 #1 / 外键:用户 ID
  • 索引 #2 / 外键:Group_id

我还做了一些其他的测试,比如:

@Entity
public class A implements Serializable {

    @Id
    @Column
    String a;

    @Id
    @Column
    String b;

    @Column
    String c;

}

像魅力一样工作!!


还有理由使用@EmbeddedId@IdClass吗?

还有:这是 JPA 2.1 的一部分还是 Hibernate 功能?

【问题讨论】:

    标签: spring hibernate jpa jointable


    【解决方案1】:

    JPA 需要为复合主键定义某种主键类。但实际上,这似乎主要用于需要 pk 类实例的 EntityManager find 和 getReference 调用。实现可能有自己的 pk 表示,您可以将其用于这些调用,但不会是可移植的。

    【讨论】:

    • 好的。听起来它必须是休眠功能。但这一点也不错,该项目严重依赖 JBoss/Hibernate 技术。
    • 您可能仍想定义一个键类,因为它定义了用于查找和获取引用的合同,在实体中明确说明以供将来重用。
    • 你会使用@EmbeddedId还是@IdClass@IdClass看起来比较简单,有什么缺点吗?
    • 顺便说一句:这是我的问题的答案(在 2.2.3.2. 复合标识符下):docs.jboss.org/hibernate/annotations/3.5/reference/en/… 有人说:将多个属性映射为@Id 属性:标识符类型是实体类本身,需要可序列化。不幸的是,这种方法不是标准的,只有 Hibernate 支持。
    • 我真的无法决定。一次又一次地定义引用对象的 id 的底层类型对我来说似乎毫无用处。太糟糕了,那些 JPA 家伙从来没有考虑过简单而有用的解决方案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2012-05-06
    • 2013-11-08
    相关资源
    最近更新 更多