JPA 2.1-具有一对一关系的奇怪行为

时间:2019-05-30 13:24:14

标签: hibernate jpa one-to-one

我正在以一对一的关系经历一些奇怪的行为。我在两个实体之间有一对一的关系:GeographicalLocation和IdentityDocument。在这种关系中,GeographicalLocation是父实体。该关系由IdnetityDocument实体拥有。这是JPA的实现:

@Entity
@Table(name="GEOGRAPHICAL_LOCATION")
public class GeographicalLocation implements Serializable
{
  private Long id;
  ...

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "GEOGRAPHICAL_LOCATION_ID")
  public Long getId()
  {
    return id;
  }

  public void setId(Long id)
  {
    this.id = id;
  }
  ...
}

@Entity
@Table(name="IDENTITY_DOCUMENT")
public class IdentityDocument implements Serializable
{
  private Long id;
  ...
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "IDENTITY_DOCUMENT_ID")
  public Long getId()
  {
    return id;
  }

  public void setId(Long id)
  {
    this.id = id;
  }

  @OneToOne
  @MapsId
  @JoinColumn(name = "IDENTITY_DOCUMENT_ID")
  public GeographicalLocation getPlaceOfIssue()
  {
    return placeOfIssue;
  }

  public void setPlaceOfIssue(GeographicalLocation placeOfIssue)
  {
    this.placeOfIssue = placeOfIssue;
  }

这将生成以下数据库模型:

enter image description here 现在,尝试像这样保留这些实体:

GeographicalLocation geographicalLocation = ...;
IdentityDocument identityDocument = ...;
geographicalLocationFacade.save(geographicalLocation);
identityDocument.setPlaceOfIssue(geographicalLocation);
identityDocumentFacade.save(identityDocument);

在GEOGRAPHICAL_LOCATION表中创建两条记录,而在IDENTITY_DOCUMENT中创建一条记录。 enter image description here

似乎发生的事情是,持久化后代实体会在主表中创建一条记录,而持久化该后代实体会在主表中正确创建一条记录,而在后代表中则没有任何记录。我尝试使用不同的场景并四处搜寻,但是我仍然不明白这里可能会发生什么。 在此先感谢可以遮挡某些光线的人。 亲切的问候, 尼古拉斯

1 个答案:

答案 0 :(得分:0)

这是我也曾经历过的冬眠中的错误。发现@GeneratedValue(strategy = GenerationType.IDENTITY)是原因。如果您使用AUTO而不是IDENTITY,那么它将起作用,但是我们使用IDENTITY的主要原因是为了防止休眠状态的额外选择查询确定id的最大值,将其留给数据库,这将是您的权衡要做。