首页 > 解决方案 > 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 个操作:

  1. 在匹配的 ID 上映射新值小猫
  2. 删除带有 ID 的小猫,请求中未提及
  3. 添加不在现有实体 (DB) 中的小猫

然后简单地将这个 LitterEntity 保存在数据库中。但问题是“保存”功能不会删除实体中未提及 ID 的小猫。所以二号手术毫无价值,那些小猫留在DB。

我应该坚持解决方案 1 吗?或者我该如何解决 2 号解决方案?也许还有另一种选择?

标签: javaspring-bootkotlinjpaspring-data-jpa

解决方案


推荐阅读