gpt4 book ai didi

java - JPA ManyToOne Cascade 使用 JPQL 进行更新

转载 作者:行者123 更新时间:2023-11-30 06:56:53 25 4
gpt4 key购买 nike

我有这个父类

 @Entity
@Table(name = "category")
@NamedQuery(name = "category.findAll", query = "SELECT c FROM Category c")

public class Category implements Serializable {

public Category(){}

@Column(name = "name", nullable = false)
@Id
private String name;

@Column(name = "col2")
private Boolean col2;

}

我在子表中引用了父表,如下所示:

@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "cat_name")
private Category category

当我运行此 JPQL 查询时

update  Category c SET c.name=:newName ,c.termsCanHaveChildren=:canHaveChdrn where c.name=:oldName

当我将Cascade All放入子字段时,它返回并出现外键约束错误

Cannot delete or update a parent row: a foreign key constraint fails (`terms`.`term`, CONSTRAINT `FKaykenypxci167nqioh4xx9p3a` FOREIGN KEY (`cat_name`) REFERENCES `category` (`name`))

最佳答案

问题在于持久性提供程序 (hibernate) 为子表中的 @JoinColumn(name = "cat_name") 生成的约束(以及不使用您定义的 CascadeType)...

生成的约束应指示当类别的 PK 更新时,对此列的任何引用也应更新...

我相信这个配置应该有效(但您需要先测试它,因为我总是使用脚本而不是使用 hibernate 功能生成数据库模型):

@ManyToOne
@JoinColumn(
name = "cat_name",
foreignKey = @ForeingKey(
name = "fk_child_category",
foreignKeyDefinition = "FOREIGN KEY (cat_name) REFERENCES category ON UPDATE CASCADE"
)
)
private Category category;

您还需要检查您的数据库是否支持“ON UPDATE CASCADE”...根据此 link ,oracle没有...(你用的是什么数据库?)

如果这不起作用,请尝试米歇尔的建议......

关于java - JPA ManyToOne Cascade 使用 JPQL 进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41625040/

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