我确信这是一个重复的问题,但我无法解决。我在实体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.id
和city
。
我还尝试在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并建议进行修复。