java - OneToMany 关系更新/替换子功能
问题描述
我正在构建对象 Litter 与 Kittens 具有 OneToMany 关系的功能。
@Entity(name = "litters")
data class LitterEntity(
var name: String
) {
@Id
var id: UUID = UUID.randomUUID()
@OneToMany(mappedBy="litter", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
var kittens = listOf<KittenEntity>()
}
@Entity(name = "kittens")
data class KittenEntity(
@Id
val id: UUID = UUID.randomUUID(),
var color: FurColor,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "litter_id")
@JsonIgnore
val litter: LitterEntity
)
要求是能够与 DB 中的相关小猫一起更新 Litter。如果请求中包含具有现有 ID 的小猫,则应更新它们。应添加新的 ID 小猫,如果某些 ID 未更新 - 应删除这些 ID。
我有两个解决方案。第一个:只需删除 DB 中的整个 Litter(及其所有小猫),然后保存随所有小猫请求的 Litter。
fun update(id: UUID, subscriptionRef: String, litterUpdateRequest: LitterUpdateRequest): LitterResponse {
val foundLitterEntity = getLitter(id, subscriptionRef)
litterRepository.delete(foundLitterEntity)
val savedLitter = litterRepository.save(litterUpdateRequest.toEntity(foundLitterEntity))
return savedLitter.toResponse()
}
这对我来说似乎效果很好,但我不确定在 DB 中为一个简单的功能进行两次这样的操作是否是个好主意。
对于第二种解决方案,我正在转换请求并将 LitterEntity 值映射到新的值。但对于小猫,我正在做这 3 个操作:
- 在匹配的 ID 上映射新值小猫
- 删除带有 ID 的小猫,请求中未提及
- 添加不在现有实体 (DB) 中的小猫
然后简单地将这个 LitterEntity 保存在数据库中。但问题是“保存”功能不会删除实体中未提及 ID 的小猫。所以二号手术毫无价值,那些小猫留在DB。
我应该坚持解决方案 1 吗?或者我该如何解决 2 号解决方案?也许还有另一种选择?
解决方案
推荐阅读
- c# - Xamarin Forms PanGesture 的坐标不一致
- go - Go fmt 为数学表达式生成格式不一致的结果
- php - 未找到列:使用模型引用但使用对象引用 laravel 6 的未知列
- python - 从 int 转换回 byte
- python - 合并两个数据框返回空数据框
- spyder - 在 Spyder 3.3.3 中运行当前行不起作用
- python - CondaHTTPError:URL 的 HTTP 000 连接失败 - Anaconda
- qt - Remove space between TabButton in TabBar
- asp.net-core - 如何在 .net core 3.0 应用程序中使用 sql 将新用户添加到数据库?
- java - 导入 JCC 时出错。找不到 libjava.so