我不知道什么时候可以,但我只是按照我一直想要的方式创建了复合键:不需要@EmbeddedId
而不需要@IdClass
!!
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
详细信息:
我还做了一些其他的测试,比如:
@Entity
public class A implements Serializable {
@Id
@Column
String a;
@Id
@Column
String b;
@Column
String c;
}
像魅力一样工作!!
是否还有理由使用@EmbeddedId
或@IdClass
?
而且:这部分是JPA 2.1还是Hibernate功能?
答案 0 :(得分:2)
JPA要求为复合主键定义某种主键类。但实际上,这似乎主要用于需要pk类实例的EntityManager find和getReference调用。实现可能有自己的pk表示,可用于这些调用,但不可移植。