【问题标题】:ConcurrentModificationException in Play for Scala + HibernatePlay for Scala + Hibernate 中的 ConcurrentModificationException
【发布时间】:2018-02-12 01:44:09
【问题描述】:

我在 Play/Scala 中有两个 Hibernate 类,GroupItem,其中一个组可能有很多项。我需要的是从组中删除所有项目。我尝试像这样删除:

val group = session.get(classOf[Group],groupCode)
val it = group.items.iterator
while(it.hasNext) {
   val i = it.next
   group.items.remove(i)
}

第一次迭代运行良好,但在第二次迭代中我得到ConcurrentModificationException

这是什么异常以及如何解决这个问题?

【问题讨论】:

    标签: scala hibernate playframework playframework-2.0


    【解决方案1】:

    如果您想从列表中删除当前正在迭代的元素,请使用

    it.remove()
    

    它从底层集合中移除此迭代器返回的最后一个元素。

    如果您对直接修改列表时引发 ConcurrentModificationException 的原因感兴趣,可以查看此 javadoc http://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html

    请注意,此异常并不总是表示对象已被不同的线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改了集合,则迭代器将抛出此异常。

    【讨论】:

    • it.remove 有效,但是当我保存父对象时,我得到 Hibernate 抛出的 SQL 异常。在 SQL 日志中,我看到它尝试更新项目表而不是删除行。由于它尝试将列设置为 null,因此 JDBC 会引发错误。这是日志条目:update items set group_sk=null where group_sk=?。为什么它会尝试更新而不是删除?
    • 从 group.items 列表中删除项目只会删除项目和组之间的连接 - 它不会删除项目对象本身。如果要删除 Item 对象,则需要执行 session.delete(i)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2016-11-10
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多