我有一个问题来处理mysql表的映射对象关系。 我有如下2个表:如何使用JPA2和Spring Data JPA中的关系处理复合键?
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数据JPA库的实体,我得到了一个错误:
org.springframework.dao.InvalidAccessApiUsageException: Class must not be null, nested exception is java.lang.IllegalArgumentException: Class must not be 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”已经存在于器表。
你可以在这里找到解释有关复合键: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177 – Alex 2013-05-06 02:00:19
我看了,但仍是不对我清楚。 – sunghun 2013-05-06 02:41:11
为您的复合ID创建单独的类(它将成为您的主键),然后在您的主类中使用批注'@EmbeddedId'而不是'@Id'来使用它。 – Alex 2013-05-06 03:03:46