java - 从 hibernate 变更集中删除实体是否与调用 EntityManger.detach() 一样简单?

标签 java hibernate jakarta-ee entitymanager

背景

我有一个 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/

相关文章:

java - 如何将 int 数从十进制转换为二进制

java - Hibernate 与同一类的多个多对多关系

hibernate - 通过自己的域进行Grails验证

java - 获取网页内容的最可靠方法?

java - 在 jBoss AS 7 中部署 EAR,其中包含 WAR 中的 Web 服务

java - 如何从远程无状态 session bean 实现接口(interface)?

java - 如何从 Cygwin bash shell 启动在 Eclipse 中开发的 java CLI 程序?

java - 包装在不可变对象(immutable对象)内的可变对象安全吗?

java - 如何最小化长 && 语句 - Java

java - 使用网络代理时 Hibernate 插入两次