3

mysql テーブルのマッピング オブジェクト関係の処理に問題があります。以下に示す2つのテーブルがあります。

Device
-----------
deviceId PK
deviceName

ApkInfo
--------
id PK
packageName
appName
deviceId FK

そして、ここに私のクラスがあります:

@Entity
@Table(name="Device")
public class Device implements Serializable {

   @Column
   @Id
   private String deviceId;

   @Column
   private String deviceName;

   //getters and setters

}


@Entity
@Table(name="ApkInfos")
public class ApkInfo implements Serializable {

   @Column
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   private int id;

   @Column
   @Id
   private String packageName;

   @Column
   private String appName;

   @Column
   @Temporal(TemporalType.TIMSTAMP)
   private Date installDate;

   @ManyToOne
   @JoinColumn(name="deviceId" referencedColumnName="deviceId")
   private Device device;

   //getters and setters

}

これは私にとってはうまくいきますが、テーブルで複合キーdeviceIdを使用したいと思います。packageNameApkInfos

@Entity
@Table(name="ApkInfos")
public class ApkInfo implements Serializable {

   @Colum(instable=false, updatable=false)
   @Id
   private String deviceId;

   @Column
   private String packageName;

   @Column
   private String appName;

   @ManyToOne
   @JoinColumn(name="deviceId" referencedColumnName="deviceId")
   private Device device;

   //getters and setters

}

しかし、Spring Data JPA リポジトリを使用してエンティティを保存しようとすると、エラーが発生しました。

org.springframework.dao.InvalidAccessApiUsageException: クラスは null であってはなりません、ネストされた例外は java.lang.IllegalArgumentException: クラスは null であってはなりません

ApkInfo apkInfo = new ApkInfo();
apkInfo.setDeviceId("1234");
apkInfo.setPackageName("aaa");
apkInfo.setAppName("myapp");
apkInfo.setInstallDate(new Date());
apkInfo.setDevice(new Device("1234"));

repository.save(apkInfo);

また、デバイスにはdeviceID「1234」が既​​にデバイス テーブルに存在します。

4

1 に答える 1

6

ApkInfo クラスに @IdClass を追加した別の主キー クラスを作成しました。今はうまくいきます、ありがとう。EmbeddedId については後で詳しく説明します。

エンティティ クラスに @IdClass を追加し、packageName プロパティに @Id を追加しました。また、一対多列の挿入、更新を false にしました。

@Entity
@Table(name="ApkInfos")
@IdClass(ApkInfo.class)
public class ApkInfo implements Serializable {

   @Column @Id private String deviceId;
   @Column @Id private String packageName;

   @ManyToOne
   @JoinColumn(name="deviceId" referencedColumnName="deviceId", insetable=false, updatable=false)
   private Device device;


  //getters and setters missing
}

主キー クラスにはセッターのみがあり、equals および hasCode メソッドをオーバーライドします。

public class ApkInfo implements Serializable {

   private String deviceId;
   private String packageName;


   public ApkInfo(){}
   public ApkInfo (String deviceId, String packageName){
       this.deviceId = deviceId;
       this.packageName = packageName;
   }

   public String getDeviceId(){
      return this.deviceId;
   }

   public String getPackageName(){
      return this.packageName;
   }

   @Override
   public boolean equals(Object obj){
      return (obj!=null && 
              obj instanceof ApkInfoPk && 
              deviceId.equals(((ApkInfoPk)obj).getDeviceId())  && 
              packageNames.equals(((ApkInfoPk)obj).getPackageName()) );
   }

   @Override
   public int hashCode(){
      super.hashCode();
   }
}
于 2013-05-06T03:43:48.227 に答える