【问题标题】:Incorrect mapping between Father and Child tables父表和子表之间的映射不正确
【发布时间】:2020-06-18 10:53:44
【问题描述】:

我正在尝试在 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>

为了拯救与父亲相关的孩子实体,我不调用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 中的 Sets 我也找不到任何线索。

【问题讨论】:

    标签: spring spring-boot kotlin mapping spring-data-jdbc


    【解决方案1】:

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

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

    如果孩子是父亲聚合的一部分,请删除 father 引用或用 @Transient 标记它。 在后一种情况下,您可以在FatherDaoAfterLoadCallback 的构造函数中设置值

    如果孩子是他们自己的集合childrensfather 引用都应该被删除,而应该使用一个 id(或包含一个 id 的实体集)。 除了双向关系,您还可以使用查询方法来加载孩子的父亲,反之亦然。

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

    【讨论】:

    • 在我的情况下,childrenfather 聚合的一部分,因为它作为一个独立实体几乎没有意义。删除参考就可以了。感谢您提供非常详细的解释和有用的链接!
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2010-09-28
    • 2020-03-21
    • 2012-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    相关资源
    最近更新 更多