gpt4 book ai didi

java - 仅使用业务 key 保存对象。 [ hibernate ]

转载 作者:行者123 更新时间:2023-12-02 02:51:01 24 4
gpt4 key购买 nike

嗨,我有一个任务,我想保存一些 ParentObject,但是这个 ParentObject 通过表上的 PK 与 ChildrenObject 相关。但按照我的逻辑,我没有 PK 唯一的业务 key (代码)。当我只有业务 key (代码)时,我的问题是如何用这个childrenObject的FK保存parenObject。 (业务键是唯一的,就像子表中的PK一样)。

我可以通过业务 key 获取childrenTable 来手动完成此操作,然后更新与parentObject 相关的PK 女巫。但我认为这很愚蠢,我希望 Hibernate 可以为我做到这一点。

代码:

@Entity
@Table(name = "parent_object")
public class ParenObject {
@Id
private Integer id;

@NaturalId
@Column(name = "code", unique = true, nullable = false)
private String code;

@Column(name = "name", unique = true, nullable = false)
private String name;

@ManyToOne
@JoinColumn(name = "children_id")
private ChildrenObject childrenObject;
}

@Entity
@Table(name = "children_object")
public class ChildrenObject {
@Id
private Integer id;

@NaturalId
@Column(name = "code", unique = true, nullable = false)
private String code;

@Column(name = "name", unique = true, nullable = false)
private String name;

}

使用 CRUD 存储库,我只想简单地保存该对象:

{ "id": null,
"code": "12345",
"name": "Parent Entity",
"childrenObject": {
"id":null,
"code":"09876",
"name": "Children Entity"
}
}

最佳答案

不幸的是,您似乎必须先获取它。正如 The best way to map a @NaturalId business key with JPA and Hibernate 中提到的:

Hibernate already has a well-established logic for loading and associating entities by their identifier in the Persistence Context.

对于存储对象来说似乎也是如此,并且 Hibernate 严重依赖于 @Id 列。即使要使用自然标识符加载实体,它也会首先执行一个查询来获取实际的 @Id,然后进行第二个查询来获取实体本身(基于同一篇文章中的示例):

SELECT c.id AS id1_0_
FROM ChildrenObject c
WHERE c.code = 'child-code'

SELECT c.id AS id1_0_0_,
c.code AS code2_0_0_,
c.name AS name3_0_0_
FROM ChildrenObject c
WHERE c.id = 1

关于java - 仅使用业务 key 保存对象。 [ hibernate ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57108811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com