4

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

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

用户.java

@Entity
public class User {
    @Id
    ...

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

组.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 / 外键:User_id
  • 索引 #2 / 外键:Group_id

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

@Entity
public class A implements Serializable {

    @Id
    @Column
    String a;

    @Id
    @Column
    String b;

    @Column
    String c;

}

奇迹般有效!!


还有任何理由使用@EmbeddedIdor@IdClass吗?

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

4

1 回答 1

2

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

于 2013-09-25T16:29:40.100 回答