我在对嵌套在聚合根的另一个子实体内的实体集合进行级联持久操作时遇到问题。换句话说,我试图将实体集合与已经处于一对多关系的
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 转换为聚合根?
谢谢
我想要实现的目标有可能吗?
说实话,我不完全确定你想要实现什么目标。
但是您当前的映射存在问题。
Reservation
的ID与数据库中从RESERVATION
到UNIVERSAL_RECORD
所需的反向引用发生冲突。
这些应该是数据库中的两个单独的字段,它们一起形成 RESERVATION
的主键。
当然,如果你愿意的话,让 id 本身唯一也是可以的。
如果您使用 UUID 作为 id 字段,您必须像为聚合根所做的那样创建 UUID。 对于非根实体,这应该发生在您已用于设置聚合根 id 的根的事件侦听器中。
最后,如果实体中有单个引用、
List
或 Map
元素,这些实体不需要专用 ID,而且在我看来,它们不应该有专用 ID,因为主键是根据 ID 构造的聚合根加上 List
和 Map
保存索引/键的列。
我也遇到了同样的问题。我有一个年龄门结构 A,其中包含类型 B 的子级,类型 B 包含类型 C 的子级。A 可以与子级 B 一起保存,但子级 C 不能与聚合 A 一起保存,因为 data-JDBC 期望 A 的外键那是无稽之谈。 C 类型需要一个外键来代替 b 类型。此外,我以为我做错了什么,但如果你只能保存简单的父子关系而不超出这个范围,我真的不知道你如何考虑在生产中使用data-JDBC。