这是场景:
EntityA和EntityB之间存在一对多关联:
@Entity
@Table(name = "EntityA")
class EntityA {
@Id
Long idEntityA;
@OneToMany(mappedBy = "entityA", fetch = FetchType.LAZY)
Set<EntityB> entitiesB;
}
@Entity
@Table(name = "EntityB")
class EntityB {
@Id
Long idEntityB;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "idEntityA")
private EntityA entityA;
}
还有一个数据库视图,其中包含 EntityA 记录的子集。它有自己的实体表示:
@Entity
@Table(name = "V_EntityA")
class ViewEntityA {
@Id
Long idEntityA;
@OneToMany(mappedBy = "entityA", fetch = FetchType.LAZY)
Set<EntityB> entitiesB;
}
我一直能够使用关联 ViewEntityA.entitiesB,没有任何问题,直到升级到 SpringBoot3 和 Hibernate 6。
现在,如果我尝试访问任何 ViewEntityA.entitiesB 我收到此错误:
协会 'mypackage.ViewEntityA.entitiesB' 是 “mappedBy”名为“entityA”的属性引用了错误 实体类型“mypackage.EntityA”,预期 'mypackage.ViewEntityA'
有什么办法可以让它恢复正常吗?
几天后,我找到了使用 @JoinColumn:
的解决方案@Entity
@Table(name = "V_EntityA")
class ViewEntityA {
@Id
Long idEntityA;
@OneToMany
@JoinColumn(name = "idEntityA", referencedColumnName = "idEntityA")
Set<EntityB> entitiesB;
}
有了这个 Hibernate 就能够创建正确的 SQL 查询并检索由 idEntityA 过滤的 EntityB 集合。
PS:我知道这可能不是最好的解决方案。我什至不知道 @JoinColumn 是否应该这样使用。我会对此进行更多研究,但有时您需要快速解决现实生活中的问题,迫不及待。