当前位置: 首页 > 知识库问答 >
问题:

用JPA手动控制数据库更新

夏谦
2023-03-14

但是,应用程序的用法似乎并不符合标准的JPA方法,即在对象的每次更改时进行更新。

应用程序的使用情况是,每次只有几百个对象处于活动状态,但每秒更新几次。

虽然应用程序在内存中有对象,但不需要在数据库中不断更新它们,这将是无用的IO。

共有1个答案

穆飞龙
2023-03-14

如果您希望不对实体进行DB更改,只需将它们与实体管理器分离。

  1. 要在事务期间从实体管理器分离对象,只需使用detach方法。
  2. 如果实体未被管理(即事务关闭后),则该实体无论如何也未被管理,并且您可以对它们进行任何更改,而无需额外代码。

JPA2.0规范的一个节选,关于实体是如何分离的:

然后在决定进行DB更改时,只需合并分离的实体:EntityManager.merge(entity);

我认为,您错过了一些JPA背景,例如实体的状态和entityManager的操作。我重新评论是为了搜索一些教程,或者阅读JPA规范中的一些章节(阅读第3.2章实体实例的生命周期,大约5页,我保证您会理解很多内容)。此外,如果您希望合并操作级联,那么在JPA中也有一个解决方案。对于EntityManager的操作&JPA中的良好介绍:官方教程。

更新我将尝试描述您在这些教程中找到什么是重要的。

合并操作实际上是用来更新和持久化实体实例E1的操作。它返回一个托管实体实例E2,而传递的实体E1仍然不是托管的。

entityManager不会跟踪另一端的分离实体,这意味着entityManager不会看到您所做的更改,直到您不合并该实体。

这两个操作(还有一个persist操作,我没有讨论)都是切换实体实例管理的状态的方法。

 类似资料:
  • 我对一个应用程序的JPA层进行了几个单元测试。这个JPA层由JPA实体和一个提供持久化实体所需的基本API的服务组成。单元TET直接使用javax.Persistence类来处理PersistenceManager。然后测试持久性API,我可以在日志中看到创建表和序列等的SQL语句。 persistence.xml文件的相关部分如下所示: 我已经下载了Windows安装程序H2 1.4.200,并

  • 15.3 控制数据库连接 15.3.1 DataSource Spring用DataSource来保持与数据库的连接。DataSource是JDBC规范的一部分同时是一种通用的连接工厂。它使得框架或者容器对应用代码屏蔽连接池或者事务管理等底层逻辑。作为开发者,你无需知道连接数据库的底层逻辑;这只是创建datasource的管理员该负责的模块。在开发测试过程中你可能需要同时扮演双重角色,但最终上线时

  • 12.3. 控制数据库连接 12.3.1. DataSourceUtils类 DataSourceUtils作为一个帮助类提供易用且强大的数据库访问能力, 我们可以使用该类提供的静态方法从JNDI获取数据库连接以及在必要的时候关闭之。 它提供支持线程绑定的数据库连接(比如使用DataSourceTransactionManager 的时候,将把数据库连接绑定到当前的线程上)。 注:getDataS

  • 问题内容: 不久,我将一个实体映射为在启用了二级缓存(只读策略)的数据库(Oracle)中查看-ehcache。 如果我手动更新数据库中的某些列,则不会更新缓存。 我没有找到任何方法可以做到这一点。仅当更新将通过Hibernate实体完成时。 我可以以某种方式实现此功能吗? 也许乔布监视表(或视图)?或者也许有某种方法可以通知Hibernate有关具体表中数据库的更改。 感谢您将来的回答! 问题答

  • 和 和 我的存储库: