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
を使用したいと思います。packageName
ApkInfos
@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」が既にデバイス テーブルに存在します。