gpt4 book ai didi

database - 禁用外键取消引用 Hibernate

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:32 25 4
gpt4 key购买 nike

在某些情况下,Hibernate 在删除时取消引用外键

在 Hibernate 中定义 OneToMany 关系时(使用注释)。在映射端(多端),我使用 id 列而不是实体来定义此类映射。这主要是因为在“一”方有一个此类实体的列表。这样定义属性有助于避免循环依赖。

在下面的示例中,Listing 实体通过 mainListingId 列保存对 MainListing 的引用。同时,MainListing 实体包含列表实体的集合。

在删除实体时,我在数据库级别应用软删除。每个表都有一个 deleted 列(bool)来指示一行是否被删除。因此,不需要从数据库中完全删除删除条目。

我遇到的问题与 hibernate 中的删除过程有关。上面定义的设置适用于其他实体关系设置。但是,在上面定义的用例中,在执行删除时,将执行设置 fk_id=null 的更新语句,从而导致条目被取消引用。在此示例中,发生以下情况 mainListingId=null,从而断开了 Listing 和 MainListing 之间的链接。这不是预期的行为,因为我仍然希望能够在删除后检索 MainListing 实体及其所有关联的列表。

注意:这只会发生在以下情况- @OneToMany 关系- ID 列引用而不是实体(下面的代码片段)

@Entity
@SQLDelete(sql = "update main_listing set deleted=1 where id=?")
MainListing {
...
@OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
@JoinColumn(name = "main_listing_id", referencedColumnName = "id")
@Where(clause = "deleted=false")
var listings: List<Listing> = emptyList(),
...
}

@Entity
@SQLDelete(sql = "update listing set deleted=1 where id=?")
Listing {
...
@Column(name = "main_listing_id", updatable = false)
var mainListingId: Long? = null,
...
}

最佳答案

解决方案是将以下内容添加到父实体

@JoinColumn(... nullable=false, insertable=false)

以上服务于以下目的

  • 解决了删除时的取消引用问题
  • 不影响更新行为,因为默认情况下 updatabale=true
  • 不影响插入,因为插入时外键的默认值为空

关于database - 禁用外键取消引用 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54549324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com