我有一个Appliance实体,如下所示:
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
是返回到Appliance.id
的PK和FK? Appliance
一定不知道ThirdPartyApplianceMapping
。我正在使用Hibernate的JPA 2实现。
答案 0 :(得分:1)
可以在MapsId的帮助下完成:
指定一个ManyToOne或OneToOne关系属性 提供EmbeddedId主键(属性)的映射 在EmbeddedId主键中,或 父实体。
在这种情况下,appliance
应该用MapsId
进行注释:
@OneToOne
@JoinColumn(name="applianceId")
@MapsId
private Appliance appliance;
也删除了nullable=false
,因为根据定义,主键不能为空。
答案 1 :(得分:0)
可以将@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;
}