【发布时间】:2014-08-20 14:08:13
【问题描述】:
我有一个由 Hibernate 4.3.4 管理的实体,它有一个 1-many 的其他实体集合。
在处理过程中,我必须分离父实体(它将分离级联到子列表)。但是,当我向列表中添加一个尚未持久化的新项目并执行分离时,我得到一个由 Hibernate 4.3.0 https://github.com/hibernate/hibernate-orm/commit/c8b20660ed56432a946e78794be147422e80ede6 中的更改引起的 IllegalArgumentException ("Non-entity object instance passing to evict")。
有没有办法级联分离包含非持久实体的对象树?如果可能的话,我更喜欢使用 ORM 级联分离映射,因为我有一些相当复杂的对象树,我不想尝试自己构建分离逻辑。
谢谢, 埃里克
【问题讨论】:
-
您确定要这样做吗?听起来很乱。如果您将内容添加到列表中并且此时没有持久化它们,这意味着您以后将无法持久化它们,除非您单独跟踪非持久性实体。是否有充分的理由不保留您在添加时添加的内容?如果只是在用户中止任务时您可能想放弃它们,则应该使用事务:启动事务,将要添加到子列表中的内容持久化,然后提交或回滚事务.
-
在持久化之前分离的原因是我需要运行一些数据库查询作为验证逻辑的一部分。由于我的数据库不支持嵌套事务,这些查询导致过早刷新。
-
你不能在不使用事务的情况下执行验证吗?您不应该需要交易来阅读;只为写作。验证通常只是阅读的情况。
-
我的印象是,Hibernate 中的所有数据库访问都必须是事务性的,即使它只是一个只读事务。这些可能会解决这个问题,但还有另一个问题。如果仍然附加“实时”对象,即使在非事务或只读方法中也可以读取持久版本吗?我认为 EntityManager 总是会给你一个指向你已经拥有的指针。 (我不是为实施辩护,我相信它可以用不同的方式解决)