首页 > 解决方案 > JPA 2.1 - 一对一关系的奇怪行为

问题描述

我在一对一的关系中遇到了一些奇怪的行为。我在两个实体之间有一对一的关系: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;
  }

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

在此处输入图像描述 现在,尝试像这样持久化这些实体:

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

在 GEOGRAPHICAL_LOCATION 表中创建两条记录,在 IDENTITY_DOCUMENT 表中创建一条记录。 在此处输入图像描述

似乎发生的情况是,持久化子实体会在主表中创建一条记录,而持久化主实体正确地会在主表中创建一条记录,而在子表中则没有。我试图玩不同的场景并四处搜索,但我仍然不明白这里可能会发生什么。非常感谢任何可以遮光的人。亲切的问候,尼古拉斯

标签: hibernatejpaone-to-one

解决方案


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


推荐阅读