0

OK、私はすべてを試しましたが、これを機能させることはできません:

私は次の表を持っています:

  • user_id int、users.idを参照します
  • platform_id int、platforms.idを参照します
  • field1
  • field2
  • ..。

私の主キー(DB内および論理的に)はとの組み合わせuser_idですplatform_id

UserクラスとPlatformクラスをメンバーとして持つ複合キーを作成したいと思います(通常のOneToOneまたはOneToManyリレーションで行うように)。

複合キーには、IDだけでなく、実際のクラス参照が必要です(後で、いくつかの計算で実際の参照が必要になったときに、はるかに簡単になります)。

さらに、このUserPlatformDataクラスとOneToMany関係を持つUserクラスが必要です。

UserとPlatformを使用してEmbeddableクラスを作成できましたが、JPAは常に挿入を行い、pkが同じであっても既存のレコードを更新することはありません(これによりduplicate entry for key primary...)。

他の2つの参照(プリミティブではない)で構成される主キーを使用してクラスを作成するにはどうすればよいですか?

4

1 に答える 1

1
  1. @IdClass アノテーションと 2 つの @Id アノテーションを使用して、エンティティを宣言します。id フィールド タイプには次の 2 つのオプションがあります。
    (i) 基本タイプ: DB 列の一致、または
    (ii) 非基本タイプ: FK を介して @ManyToOne として参照されるエンティティ オブジェクト。FK 関係を PK の一部にすることができます。この 2 番目のケースが必要だと言いました。

      @Entity   
      @IdClass(UserPlatformId.class)       
      public class UserPlatform {  
    
           @Id 
           @ManyToOne
           User user;
           @Id
           @ManyToOne
           Platform platform;
    
        // ...
    
     }
    
  2. 複合 PK フィールドを記述する javabean id クラスを宣言します。

    • ここでのフィールド タイプは、基になる DB 列と一致する基本タイプである必要があります。これは、User クラスの @Id フィールドおよび Platform クラスの @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 は不変でなければなりません。

いいですね =:-)

于 2012-10-15T02:40:38.410 に答える