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



我确信这是一个重复的问题,但我无法解决。我在实体Home和实体Address之间具有一对零或一的共享主键关系。

我的问题是我一直得到一个错误

缺少列:id

我正在映射我的实体,如图所示,但不同的是,我的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"),但没有帮助。

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

  • 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.getAliasedLHSColumnName():中的代码

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

我认为它还应该检查类型.getLHSPropertyName()是否未由XML映射中的"property ref"属性填充。如果您有一个测试用例,最好将问题提交给Hibernate并建议进行修复。

最新更新