在子端具有共享主键和@OneToOne的单向一对一关系

时间:2019-02-27 23:39:40

标签: hibernate jpa jpa-2.0

我有一个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实现。

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;

}