没有@EmbeddedId或@IdClass的超级简单复合键

时间:2013-09-25 15:51:23

标签: spring hibernate jpa jointable

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

  • Spring 4.0.0.M3
  • Hibernate 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详细信息:

  • PRIMARY KEY:User_id,Group_id,s
  • INDEX#1 / FOREIGN KEY:User_id
  • INDEX#2 / FOREIGN KEY: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功能?

1 个答案:

答案 0 :(得分:2)

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