背景
我有一个 java/spring 系统,其中的事务是通过自定义 HandlerInterceptor 手动管理的。也就是说:
- 在每个请求开始时都会打开一个事务(系统的不幸部分是任何请求都可能导致写入数据库)
- 一个 EntityManager 实例加入交易
- 实体管理器用于加载被修改的实体。 EntityManager 跟踪所有更改
- 在每个请求结束时,EntityManager 被刷新并提交
是的,这并不理想,但我并没有创建这个系统,它足够简单,可以让我们在它的范围内工作——我不想在没有充分理由的情况下改变它。
我不习惯 commit-all-tracked-entities-on-flush 行为,所以一直在做类似的事情:
//change entity
if(ovalValidator.isValid(entity))
em.persist(entity);
我需要解决这个问题以适应我的新理解并将上面的内容切换到这个似乎可行:
//change entity
if(!ovalValidator.isValid(entity))
em.detach(entity);
我的问题
据我了解,这只是将实体从刷新队列中删除,即使它被标记为脏。它是否正确?有没有更好的方法来实现我想要的(不保存对该实体的更改)?如果我这样做,有什么需要注意的吗?
最佳答案
detache 从 session 中删除实体(changeTracking、lazyloading,...),它会做你想做的事。您还可以实现 en 拦截器,删除无效实体的脏标记,但我认为您的解决方案也可以工作
关于java - 从 hibernate 变更集中删除实体是否与调用 EntityManger.detach() 一样简单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300795/