我有一个设备实体,如下:
public class Appliance {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
// other appliance fields
}
然后,我还有另一个用于将第三方设备映射到设备的类:
public class ThirdPartyApplianceMapping {
@Id
private Long applianceId;
private Long thirdPartyApplianceId;
@OneToOne
@JoinColumn(name="applianceId", nullable=false)
private Appliance appliance;
}
我希望数据库结构为:
Appliance(
id PK,
-- other columns but no col reference to ThirdPartyApplianceMapping
)
ThirdPartyApplianceMapping(
applianceId PK FK references Appliance.id,
thirdPartyApplianceId
)
如何定义/注释我的实体,以使ThirdPartyApplianceMapping.applianceId
是PK,而FK回到Appliance.id
?Appliance
一定不知道ThirdPartyApplianceMapping
。我正在使用Hibernate的JPA2。
可以在mapsid的帮助下完成:
指定多个人或一个接通关系属性 为嵌入式主键提供映射,属性 在嵌入式主键或简单的主键内 父实体。
在这种情况下,appliance
应用MapsId
注释:
@OneToOne
@JoinColumn(name="applianceId")
@MapsId
private Appliance appliance;
也删除了 nullable=false
,因为从定义上讲,主键无法为空白。
@ID注释或ID XML属性可以添加到OneToOne或 许多映射。用于对象的ID将从 目标对象的ID。如果ID是一个值,则源 对象的ID与目标对象的ID相同。
来源:Wikibooks
因此,对于您的情况,这应该做到这一点:
public class ThirdPartyApplianceMapping {
private Long thirdPartyApplianceId;
@Id
@OneToOne
@JoinColumn(name="applianceId", nullable=false)
private Appliance appliance;
}