使用JPQL更新JPA ManyToOne Cascade

时间:2017-01-12 23:41:56

标签: java hibernate jpa jpql

我有父类

 @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`))

2 个答案:

答案 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)中使用。

使用代理不可变主键。