我有父类
@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
当我在子字段中放置级联全部时,它返回外键约束错误
Cannot delete or update a parent row: a foreign key constraint fails (`terms`.`term`, CONSTRAINT `FKaykenypxci167nqioh4xx9p3a` FOREIGN KEY (`cat_name`) REFERENCES `category` (`name`))
答案 0 :(得分:1)
问题在于持久性提供程序(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不会...(您使用的是什么数据库?)
如果这不起作用,请尝试米歇尔的建议......
答案 1 :(得分:0)
这是预期的:您正在更改主键(@Id),它在外键(@JoinColumn)中使用。
使用代理不可变主键。