2个引用字段上的JPA主键

时间:2012-10-14 16:02:59

标签: hibernate jpa

好的,我已经尝试了一切,但是无法使其发挥作用:

我有下表:

  • user_id int,引用users.id
  • platform_id int,引用platforms.id
  • FIELD1
  • FIELD2
  • ...

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

我想创建一个将User和Platform类作为成员的复合键(就像我使用常规的OneToOne或OneToMany关系一样)。

我希望复合键具有实际的类引用而不仅仅是id(以后当我需要实际引用进行某些计算时更容易)。

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

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

如何使用包含两个其他引用(而不是基元)的主键创建一个类?

1 个答案:

答案 0 :(得分:1)

  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;
    
        // ...
    
     }
    
  2. 声明一个javabean id类来描述复合PK字段。

    • 字段类型必须是基本类型,与基础数据库列匹配,这些基本类型与User类的@Id字段和Platform类的@Id字段相同。这里总是使用基本类型,即使您使用实体@Id字段的非基本类型(上面的ii)。
    • Id类中的字段名称必须与实体中的字段名称匹配。 因此,@ IdClass充当从实体中的非基本类型到数据库中的基本类型的映射形式:
  3. 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应该是不可变的。

    很高兴= = - - )