从Hibernate 5.2.5.final升级到5.2.8.final重复主键问题
我们有两个实体,A和B,A有一个B,它是由B_id进行的一对一映射从Hibernate 5.2.5.final升级到5.2.8.final重复主键问题,hibernate,duplicates,upgrade,one-to-one,Hibernate,Duplicates,Upgrade,One To One,我们有两个实体,A和B,A有一个B,它是由B_id进行的一对一映射 @Entity @Table(name = "A") public class A { @Id @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "IdOrGenerated") @GenericGenerator(name = "IdOrGenerated", strategy = "com.xxx.yyy.UseIdOrGenerate
@Entity
@Table(name = "A")
public class A
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "IdOrGenerated")
@GenericGenerator(name = "IdOrGenerated", strategy = "com.xxx.yyy.UseIdOrGenerate")
@Column(unique = true, nullable = false)
private String id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "b_id")
private B b;
}
@Entity
@Table(name = "B")
public class B
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "IdOrGenerated")
@GenericGenerator(name = "IdOrGenerated", strategy = "com.xxx.yyy.UseIdOrGenerate")
@Column(unique = true, nullable = false)
private String id;
private String name;
}
数据库架构:
A{id,b_id};PK:id;FK_B_ID->表B'ID
B{id,name};PK:id
它适用于Hibernate 5.2.5.final。当我们尝试升级到5.2.8.final时,出现错误:键“PRIMARY”的重复条目“414b017c-c014-4344-99af-595f9a80a388”
Hibernate似乎将b_id设置为A两次
我们尝试过,如果我们使用B表上的A_id将B映射到A,那么Hibernate 5.2.8.final就可以了
Hibernate 5.2.8.final的总结:
1.通过子表上的父id将一对一子映射到其父,这是确定的;
2.一对一的子项通过父表上的子项id映射到其父项,这会导致子项的主键id重复
以上两种情况都适用于Hibernate 5.2.5.final
关于如何使案例2适用于Hibernate 5.2.8.final,有什么想法吗?目前,我们不想更改数据库模式
谢谢,Jing我们发现根本原因是AbstractProducedQuery。当5.2.8.final中查询的maxResult为零时,doList()返回空集合,但在5.2.5中忽略maxResult零。为某个实体填充FK时,查询在5.2.8.final中返回null,这会导致错误。在我们修复了没有设置maxResult zero的查询错误之后,升级就可以了。我们发现根本原因是AbstractProducedQuery。当5.2.8.final中查询的maxResult为零时,doList()返回空集合,但在5.2.5中忽略maxResult zero。为某个实体填充FK时,查询在5.2.8.final中返回null,这会导致错误。在我们修复了没有将maxResult设置为零的查询错误之后,升级就可以了。