好的,我已经尝试了一切,但是无法使其发挥作用:
我有下表:
我的主键(在数据库和逻辑上)是user_id
和platform_id
的组合。
我想创建一个将User和Platform类作为成员的复合键(就像我使用常规的OneToOne或OneToMany关系一样)。
我希望复合键具有实际的类引用而不仅仅是id(以后当我需要实际引用进行某些计算时更容易)。
此外,我需要User类与此UserPlatformData类具有OneToMany关系。
我能够使用User和Platform创建一个Embeddable类,但JPA总是插入并且永远不会更新现有记录,即使pk相同(导致duplicate entry for key primary...
)。
如何使用包含两个其他引用(而不是基元)的主键创建一个类?
答案 0 :(得分:1)
使用@IdClass注释和两个@Id注释声明您的实体。 id字段类型有两种选择:
(i)基本类型:匹配DB列OR
(ii)非基本类型:通过FK引用为@ManyToOne的实体对象,允许FK关系成为PK的一部分。
你说你想要第二种情况:
@Entity @IdClass(UserPlatformId.class) public class UserPlatform { @Id @ManyToOne User user; @Id @ManyToOne Platform platform;
// ...
}
声明一个javabean id类来描述复合PK字段。
public class UserPlatformId {
int user;
int platform;
public UserPlatformId();
public UserPlatformId(int userId, int platformId) {
this.user=userId; this.platform=platformId; }
public int getUser() { // ...};
public int getPlatform() { // ...};
}
你可以省略setter方法,而是有一个额外的构造函数来预先设置字段。一旦创建,Id应该是不可变的。
很高兴= = - - )