2012-10-14 47 views
0

OK,我用尽了一切,只是不能做这个工作:JPA 2个引用的字段主键

我有以下表格:

  • USER_ID INT,引用users.id
  • 平台_id INT,引用platforms.id
  • 字段1
  • 场2
  • ...

我的主键(在DB和逻辑上)是user_idplatform_id的组合。

我想创建一个组合键,将用户和平台类作为成员(就像我会与常规OneToOne或OneToMany关系一样)。

我希望组合键具有实际的类引用,而不仅仅是id(稍后当我需要某些计算的实际参考时,我会更容易)。

此外,我需要User类与此UserPlatformData类具有OneToMany关系。

我能够使用User和Platform创建Embeddable类,但JPA始终插入并且从不更新现有记录,即使pk相同(导致duplicate entry for key primary...)。

如何创建一个由两个其他引用(而非原语)组成的主键的类?

回答

1
  1. 声明您的实体,使用@IdClass注释和两个@Id注释。对于id字段类型,有两种选择:(i)基本类型:匹配数据库列或
    (ii)非基本类型:通过FK引用为@ManyToOne的实体对象,允许FK关系成为PK。 你说你想要这个第二种情况:

    @Entity 
        @IdClass(UserPlatformId.class)  
        public class UserPlatform { 
    
         @Id 
         @ManyToOne 
         User user; 
         @Id 
         @ManyToOne 
         Platform platform; 
    
    // ... 
    
    } 
    
  2. 声明一个JavaBean ID类来描述复合PK场。

    • 字段类型必须是基本这里类型,匹配底层DB列,这将是相同的基本类型的用户类的@Id字段和平台的类的字段@Id。这里总是使用基本类型,即使您使用实体@Id字段的非基本类型(ii以上)。
    • Id类中的字段名称必须与实体中的字段名称相匹配。 的@IdClass因此用作在该实体基本类型在DB从非基本类型映射的形式:
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() { // ...}; 
} 

可以省略设置器方法,而是有一个额外的构造函数来预先设置字段。一旦创建,Id应该是不可变的。

好走= :-)