从Hibernate 5.2.5.final升级到5.2.8.final重复主键问题

从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

我们有两个实体,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")
  @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设置为零的查询错误之后,升级就可以了。