0

我确定这是一个重复的问题,但我无法让它发挥作用。Home我与 entity和 entity之间的共享主键具有一对零或一的关系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.idand city

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

4

1 回答 1

0

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

问题通常是查询 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 并建议修复。

于 2016-01-12T16:22:27.803 回答