缺少列:具有共享 PK 的一对一映射上的 id

Posted

技术标签:

【中文标题】缺少列:具有共享 PK 的一对一映射上的 id【英文标题】:Missing column: id on a one-to-one mapping with shared PK 【发布时间】:2016-01-11 15:27:25 【问题描述】:

我确定这是一个重复的问题,但我无法让它发挥作用。我与实体 Home 和实体 Address 之间的共享主键存在一对零或一关系。

我的问题是我不断收到错误

缺少列:id

我正在映射我的实体,如here 所示,但不同的是,我的Address 实体的列名不称为id,而是homeId_pf

这是我的实体:

@Entity
@Table(name = "homes")
@Getter
@Setter
public class Home implements Serializable 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false, updatable = false)
    private Long id;


    @OneToMany(fetch = EAGER, cascade = ALL, orphanRemoval = true)
    @JoinColumn(name = "homeId_fk", referencedColumnName = "id", nullable = false)
    private Set<Room> rooms = new HashSet<>();

    @OneToOne(fetch = EAGER, cascade = ALL)
    @PrimaryKeyJoinColumn
    private Address address;




@Entity
@Table(name = "addresses")
@Getter
@Setter
public class Address implements Serializable 

    @Id
    @Column(name = "homeId_pf")
    private Long id;

    private Integer city;


    @MapsId
    @OneToOne
    @JoinColumn(name = "id")
    private Home home;

如前所述,我的addresses 表有两列:homeId_pf,设置为 PK,FK 设置为homes.idcity

我也尝试在Address 类上设置@JoinColumn(name = "homeId_pf"),在Home 实体上设置@PrimaryKeyJoinColumn(referencedColumnName = "homeId_pf"),但没有帮助。

【问题讨论】:

可能是一个重复的问题:这有帮助吗? ***.com/questions/11938253/jpa-joincolumn-vs-mappedby 【参考方案1】:

一对一关联存在很多问题,请参阅

https://hibernate.atlassian.net/browse/HHH-2158 https://hibernate.atlassian.net/browse/HHH-1849

问题一般是查询 Home.address.id = ?替换为 Home.id = ?就好像它是一对一的共享主键(而不是你的一对零或一)。

Hibernate 在一对一处理外键时会出现同样的错误。

您是在做 Criteria 还是 HQL 查询? 在 Criteria 中,您可以避免在 Home.address 上创建别名和查询 alias.id 的问题。在 HQL 中,您可以进行子查询。

我没有时间纠正 Hibernate 中的错误,但如果您有测试用例,我认为问题来自 org.hibernate.engine.JoinHelper.getAliasedLHSColumnNames() 中的代码:

if ( type.useLHSPrimaryKey() ) 
        return StringHelper.qualify( alias, lhsPersister.getIdentifierColumnNames() );
    

我认为它还应该检查 type.getLHSPropertyName() 是否被 XML 映射中的“property-ref”属性填充。 如果您有测试用例,最好将问题提交给 Hibernate 并提出修复建议。

【讨论】:

以上是关于缺少列:具有共享 PK 的一对一映射上的 id的主要内容,如果未能解决你的问题,请参考以下文章

如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体

EF 代码优先 - 配置一对零或一关系,无需共享 PK/FK

使用中间表来定义一对一关系以避免外键循环的雄辩方式

如何在没有连接列的情况下映射一对一关系(实体通过它们的 ID 连接)?

休眠一对多映射注释问题

使用 EF7 映射一对零或一