从 hibernate 变更集中删除实体就像调用 EntityManger.detach() 一样简单吗?

发布于 2025-01-06 03:55:20 字数 734 浏览 2 评论 0原文

背景

我有一个 java/spring 系统,其中事务是通过自定义 HandlerInterceptor 手动管理的。也就是说:

  • 在每个请求开始时,都会打开一个事务(系统的一个不幸的部分是任何请求都可能导致写入数据库),
  • EntityManager 实例加入事务,
  • 实体管理器用于加载实体被修改。 EntityManager 会
  • 在每次请求结束时跟踪所有更改,EntityManager 会刷新并提交。

是的,这并不理想,但我没有创建这个系统,它足够简单,可以让我们在其范围内工作 -如果没有充分的理由,我不会改变它。

我不习惯提交所有跟踪实体刷新行为,因此一直在做类似的事情:

//change entity
if(ovalValidator.isValid(entity))
  em.persist(entity);

我需要修复此问题以适应我的新理解,并将上面的内容切换到此似乎有效:

//change entity
if(!ovalValidator.isValid(entity))
  em.detach(entity);

我的问题

是我的理解是,这只是从刷新队列中删除实体,即使它被标记为脏。这是正确的吗?有没有更好的方法来实现我想要的目标(不保存对该实体的更改)?如果我这样做,有什么需要注意的吗?

Background

I have a java/spring system where transactions are managed manually via a custom HandlerInterceptor. That is to say:

  • at the begining of every request a transaction is opened (an unfortunate part of the system is that any request might result in a write to the db)
  • an EntityManager instance joins the transaction
  • the entity manager is used to load entities which are modified. The EntityManager tracks all changes
  • at the end of every request the EntityManager is flushed and committed

Yes this is not ideal, but I did not create this system and it's simple enough to allow us to work within it's confines - I'm not looking to change it without good reason.

I am not used to commit-all-tracked-entities-on-flush behavior and so have been doing something like:

//change entity
if(ovalValidator.isValid(entity))
  em.persist(entity);

I need to fix this to work with my new understanding and switching the above to this seems to work:

//change entity
if(!ovalValidator.isValid(entity))
  em.detach(entity);

My question

It is my understanding that this just removes the entity from the flush queue even if it IS marked as dirty. Is this correct? Is there a better way to achieve what I am trying to (don't save changes to that entity)? Is there anything I need to look out for if I'm doing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

横笛休吹塞上声 2025-01-13 03:55:20

detache 从会话中删除实体(changeTracking,延迟加载,...)它会执行您想要的操作。您还可以实现拦截器,删除无效实体的脏标记,但我认为您的解决方案也可以工作

detache removes the entity from the session (changeTracking, lazyloading, ...) it does what you want. You could also implement en interceptor removing the dirty mark of the invalid entities but i think your solution would work as well

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文