与子共享主键和@OneToOne的单向一对一关系

问题描述 投票:1回答:2

我有一个设备实体如下:

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的JPA 2实现。

hibernate jpa jpa-2.0
2个回答
1
投票

这可以在MapsId的帮助下完成:

指定ManyToOne或OneToOne关系属性,该属性提供EmbeddedId主键,EmbeddedId主键中的属性或父实体的简单主键的映射。

在这种情况下,appliance应该用MapsId注释:

@OneToOne
@JoinColumn(name="applianceId")
@MapsId
private Appliance appliance;

nullable=false也被删除,因为根据定义,主键不可为空。


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;

}
© www.soinside.com 2019 - 2024. All rights reserved.