【问题标题】:Unidirectional one-to-one relationship with shared primary key and @OneToOne on child side与共享主键和子端@OneToOne 的单向一对一关系
【发布时间】:2019-02-27 23:39:39
【问题描述】:

我有一个设备实体如下:

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


    【解决方案1】:

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

    指定 ManyToOne 或 OneToOne 关系属性 提供 EmbeddedId 主键、属性的映射 在 EmbeddedId 主键或 父实体。

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

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

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

    【讨论】:

      【解决方案2】:

      @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;
      
      }
      

      【讨论】:

      • 感谢您的回答。不幸的是,这会导致以下错误org.hibernate.MappingException: Composite-id class must implement Serializable
      • 很可能有第二个@Id 注释。你想要一个组合的主键吗?
      • 没有。 Appliance 在其实例字段 id 上只有一个 @Id。我希望 ThirdPartyApplianceMapping 将其作为其外键返回到 Appliance 并作为其主键。
      • 一个。您在回答中提到的 @Id 注释。
      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2011-06-12
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多