hibernate - 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 表中创建一条记录。
似乎发生的情况是,持久化子实体会在主表中创建一条记录,而持久化主实体正确地会在主表中创建一条记录,而在子表中则没有。我试图玩不同的场景并四处搜索,但我仍然不明白这里可能会发生什么。非常感谢任何可以遮光的人。亲切的问候,尼古拉斯
解决方案
这是休眠中的一个错误,我也经历过。发现@GeneratedValue(strategy = GenerationType.IDENTITY)
是这个原因。如果您使用 AUTO 而不是 IDENTITY 那么它会起作用,但我们使用 IDENTITY 的主要原因是防止通过休眠进行额外的选择查询来确定 id 的最大值,将其留给数据库,这将是您的权衡去做。
推荐阅读
- angular - ngOnInit 中的调用方法
- sql - 我有一张包含以下数据的表格
- sql - 我想使用带有 group by 的子查询
- angular - 如何在角材料表中对单个表使用 2 分页?
- ruby - 如何检查数组的任何元素是否大于 100?
- javascript - [].forEach.call 和 appendChild
- angular - 如何动态添加指令作为属性?
- json - 使用 cookie 从 JSON 获取对象
- sqlite - .net Core/Standard 的 SQLite 库:MS EF 还是 sqlite.org?
- wiremock - 在存根的 json 文件中生成当前日期