gpt4 book ai didi

mysql - Hibernate 奇怪的行为与 @OneToMany 和更新

转载 作者:行者123 更新时间:2023-11-29 15:26:29 25 4
gpt4 key购买 nike

让我给你简单的情况。

文章类别

@Entity
@Table(name="article")
data class Article (

@Id
var id: String = java.util.UUID.randomUUID().toString(),

@OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.EAGER)
var keywords: MutableList<Keyword> = mutableListOf()
)

关键字类别

@Entity
@Table(name="keyword")
data class Keyword(

@Id
var id: String = java.util.UUID.randomUUID().toString(),

var keyword: String = ""
)

这种情况自动生成一个名为“article_keyword”的额外表,该表本质上是ArticleKeyword 之间的联接表。这一切都是有道理的并且工作得很好。

问题

假设 Article 的列表中有 10 个 Keyword 对象,这是持久的。再次获取这篇文章,删除一个关键字并保存对象,它告诉我这一点:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

它专门在生成的 article_keyword 表中明确说明了该表中与 Article_id 相关的内容。它尝试更新 article_keyword 连接表,但无法删除任何关系,因为它对 Article 对象本身具有外键约束。这说得通。然而,我不知道如何解决它。

我尝试了很多事情,例如添加 Hibernate 生成的 @JoinTable 规范。添加orphanRemoval和许多其他东西。没有结果。

注意:我自己尝试过 Hibernate 在 mysql 中执行的查询,它们工作正常,这可能是一个提示?

<小时/>

更新:传奇仍在继续正如在 Stackoverflow 上发布您的问题一样,我已经在一定程度上解决了该问题。

为了暂时解决这个问题,因为我必须让它立即工作,所以我仅针对一项操作关闭了 foreign_key_checks。再次开机调试后,就没有再出现问题了。我绝对确定 foreign_key_checks 再次打开,而且确实如此。

发生的一件事是,article_keyword 表的 Article_id 列中不再有 foreign_key。这只是 hibernate 魔法还是我错过了什么?

到目前为止我已经尝试了一整天了。问题已经解决,但我仍然想了解这种行为。

最佳答案

根据您的代码,我可以看到两种潜在的解决方案。您可以将当前关系设置为双向链接,或者可以开始显式管理连接表。我之前没有使用过 Kotlin,所以我是从 Java 上下文翻译的,所以您可能需要将我的示例翻译回来。

双向一对多关系

@Entity
@Table(name="article")
data class Article (

@Id
var articleId: String = java.util.UUID.randomUUID().toString(),

@OneToMany(mappedBy="keyword")
var keywords: MutableList<Keyword> = mutableListOf()
)
<小时/>
@Entity
@Table(name="keyword")
data class Keyword(

@Id
var keywordId: String = java.util.UUID.randomUUID().toString(),

@ManyToOne
@JoinColumn(name="articleId")
var article: Article

var keyword: String = ""
)

或者

具有显式连接表管理的单向

@Entity
@Table(name="article")
data class Article (

@Id
var articleId: String = java.util.UUID.randomUUID().toString(),

@OneToMany
@JoinTable(name="article_keyword,
joinColumns = @JoinColumn(name="articleId"),
inverseJoinColumns = @JoinColumn(name="keywordId"))
var keywords: MutableList<Keyword> = mutableListOf()
)
<小时/>
@Entity
@Table(name="keyword")
data class Keyword(

@Id
var keywordId: String = java.util.UUID.randomUUID().toString(),

var keyword: String = ""
)
<小时/>
@Entity
@Table(name="article_keyword")
data class articlekeyword(

var articleKeywordId: String = java.util.UUID.randomUUID().toString(),

@ManyToOne
@JoinColumn(name="articleId")
var article: Article

@ManyToOne
@JoinColumn(name="keywordId")
var keyword: Keyword
)

我唯一担心的可能是,如果您选择进行双向链接,则在删除内容时可能会产生意想不到的后果,但这可能需要测试一下。我根据我的答案 here 改编了这些示例您可能会发现这很有用。

关于mysql - Hibernate 奇怪的行为与 @OneToMany 和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040625/

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