【问题标题】:Spring Data JDBC How to persist one-to-many collection nested inside another one-to-many relationshipSpring Data JDBC如何持久化嵌套在另一个一对多关系中的一对多集合
【发布时间】:2020-06-24 23:25:46
【问题描述】:

我在对嵌套在聚合根的另一个子实体中的实体集合进行级联持久化操作时遇到问题。换句话说,我试图将一组实体与一个已经在一对多关系的many 端的实体关联起来。

我有一个名为 UniversalRecord 的聚合根,其中包含一个 Reservation 列表,其中又包含一个 Segment 对象列表。

data class UniversalRecord(
  val locatorCode: String,
  val reservations: Set<Reservation>
) {
  @Id var id: UUID? = null
}


data class Reservation(
  val locatorCode: String,
  val providerCode: String,
  val providerLocatorCode: String
  val createdDate: String,
  val modifiedDate: String,
  val cancelled: Boolean = false,
  val segments: Set<SegmentRef>
) {
  @Id @Column("UNIVERSAL_RECORD") var id: UUID? = null
}

@Table("reservation_segment_ref")
data class SegmentRef(val key: String) {
  @Id @Column("RESERVATION") var id: UUID? = null
}

但是当我在 Reservation 实体中引入另一个集合时,即 List 它失败了。

这里是sql:

CREATE TABLE universal_record(
    id UUID PRIMARY KEY,
    locator_code VARCHAR UNIQUE,
);

CREATE TABLE IF NOT EXISTS reservation(
    universal_record UUID,
    locator_code VARCHAR,
    provider_code VARCHAR(2),
    provider_locator_code VARCHAR,
    created_date DATETIME,
    modified_date DATETIME,
    cancelled BOOLEAN
);

CREATE TABLE reservation_segment_ref(
    reservation UUID,
    segment UUID
);

Spring Data JDBC 可以保存聚合根中包含的实体,并使用生成的键将子实体链接到父实体,当我在子实体中添加另一个列表时失败并出现此错误: java.lang.IllegalStateException: Couldn't obtain a required id value

我想要达到的目标有可能吗?还是我也需要将 Reservation 转换为聚合根?

谢谢

【问题讨论】:

  • 我有一个 ApplicationListener 在保存操作之前为 root 生成 UUID。

标签: spring-data spring-data-jdbc


【解决方案1】:

我想达到的目标有可能吗?

说实话,我不完全确定您要达到的目标。

但是您当前的映射存在问题。 Reservation 的 ID 与数据库中所需的从 RESERVATIONUNIVERSAL_RECORD 的反向引用发生冲突。 这些应该是数据库中的两个独立字段,它们共同构成RESERVATION 的主键。 当然,如果您愿意,也可以使 id 本身独一无二。

如果您使用 UUID 作为 id 字段,则必须像为聚合根目录所做的那样创建 UUID。 在非根实体的情况下,这应该发生在您已经用来设置聚合根的 id 的根的事件侦听器中。

最后,如果您在实体中有单个引用,ListMap 元素,这些实体不需要专用 ID,老实说,他们不应该有一个,因为主键是从聚合根的 ID 加上在 ListMap 的情况下保存索引/键的列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2013-03-07
    • 2017-01-10
    • 2023-03-20
    • 2021-10-16
    • 2019-05-07
    • 2019-01-24
    相关资源
    最近更新 更多