gpt4 book ai didi

sql - 当我将 List 变量更改为 ArrayList 时出现 DataIntegrityViolationException

转载 作者:行者123 更新时间:2023-12-02 15:39:01 25 4
gpt4 key购买 nike

我有一个抛出以下异常的 grails 项目:

org.springframework.dao.DataIntegrityViolationException: could not delete: [Role#4]; SQL [delete from role where id=? an
d version=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not del
ete: [Role#4]

在我的角色域中,我为创建此错误所做的只是将其中一个变量的定义从
 List<RoleTool> roleTools = new ArrayList<RoleTool>()


ArrayList<RoleTool> roleTools = new ArrayList<RoleTool>()

这是为什么?

最佳答案

通常,在变量声明和方法签名中都将具体类指定为声明类型是不好的做法。除非您真的需要它是一个 ArrayList,否则将其保留为 List 以提供更大的灵 active 。

我不完全确定这里发生了什么,但是 Hibernate 有它自己的集合类,它用于映射集合,最常用的是 org.hibernate.collection.PersistentListorg.hibernate.collection.PersistentSet .它们分别实现 List 和 Set 接口(interface),但不扩展 ArrayList 或 HashSet 或任何典型的具体集合。相反,它们是 Hibernate 内部类,用于监视更改以帮助在持久化、刷新等时进行脏检测。

将初始集合声明为 ArrayList 很好,因为它仅在保存时读取(虽然它是 Groovy,所以使用 List<RoleTool> roleTools = [] 会更简洁)。但是 Hibernate 在加载持久实例时需要实现 List/Set 接口(interface)的灵 active 。

关于sql - 当我将 List 变量更改为 ArrayList 时出现 DataIntegrityViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3962875/

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