我有一个设备实体如下:
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的JPA 2实现。
这可以在MapsId的帮助下完成:
指定ManyToOne或OneToOne关系属性,该属性提供EmbeddedId主键,EmbeddedId主键中的属性或父实体的简单主键的映射。
在这种情况下,appliance
应该用MapsId
注释:
@OneToOne
@JoinColumn(name="applianceId")
@MapsId
private Appliance appliance;
nullable=false
也被删除,因为根据定义,主键不可为空。
可以将@Id注释或id XML属性添加到OneToOne或ManyToOne映射中。用于对象的Id将从目标对象的Id中派生。如果Id是单个值,则源对象的Id与目标对象的Id相同。
资料来源:wikibooks
所以对于你的情况,这应该这样做:
public class ThirdPartyApplianceMapping {
private Long thirdPartyApplianceId;
@Id
@OneToOne
@JoinColumn(name="applianceId", nullable=false)
private Appliance appliance;
}