与共享主钥匙和@onetoone的单向关系一对一的关系



我有一个设备实体,如下:

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.idAppliance一定不知道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;
}

最新更新