gpt4 book ai didi

spring - 父表和子表之间的映射不正确

转载 作者:行者123 更新时间:2023-12-02 13:32:35 26 4
gpt4 key购买 nike

我正在尝试在 Spring Data JDBC(版本 1.1.5.RELEASE)中建模父/子关系。到目前为止,我已经设法让插入操作正常工作,但是在读取数据时我遇到了错误。

实体看起来像这样

@Table("FATHER")
data class FatherDao(
@Id
val id: Long?,
@MappedCollection(idColumn="father_id")
val childrens: Set<ChildrenDao>
)
@Table("CHILDREN")
data class ChildrenDao(
@Id
val id: Long?,
val father: FatherDao?
)

架构如下:
CREATE TABLE father (
id INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1)
PRIMARY KEY (id)
);

CREATE TABLE children (
id INT GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1),
father_id INT
PRIMARY KEY (id)
);

现在我已经省略了 character_id 上的外键.

存储库很简单
@Repository
interface FatherRepository : CrudRepository<CharacterDao, Long>

为了拯救与父亲有关的 child ,我不调用 ChildrenRepository而是继续保存父实体。

创建进展顺利,但是当我试图获取创建的实体时,我收到以下异常
user lacks privilege or object not found: FATHER.CHILDREN_DAO in statement [SELECT CHILDREN.id AS id, father.id AS father_id FROM CHILDREN LEFT OUTER JOIN FATHER AS father ON father.children_dao = CHILDREN.id WHERE CHILDREN.father_id = ?]

我的主要问题是我无法理解 FATHER.CHILDREN_DAO 的位置。来自。我很确定这是由 FatherDao 中的错误映射引起的。实体,但即使查看 Spring Data JDBC docs关于套装我找不到线索。

最佳答案

您似乎试图在 FatherDao 之间建立双向关系。和 ChildrenDao .
Spring Data JDBC 不支持此功能。
这两个连接被认为是独立的,Spring Data JDBC 尝试加载子代引用的父亲,根据映射规则,这需要一个 CHILDREN_DAO在父亲身上。

根据您的域,有两种变体可以解决问题。
重要的问题是: child 是父亲聚合的一部分还是他们自己的聚合?

如果 child 是父亲聚合的一部分 , 要么删除 father引用或标记@Transient .
在后一种情况下,您可以在 FatherDao 的构造函数中设置值。或在 AfterLoadCallback

如果 child 是他们自己的聚合体 childrensfather应删除引用,而应使用 id(或包含 id 的实体集)。
而不是双向关系,您将使用查询方法来加载 child 的父亲,反之亦然。

文章 Spring Data JDBC, References, and Aggregates解释了此设计决策背后的原因,并提供了如何实现它的示例。

关于spring - 父表和子表之间的映射不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551611/

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