当前位置: 首页 > 面试题库 >

由应用程序管理的JPA,何时需要事务

巫马望
2023-03-14
问题内容

我们正在一个小型Web(将在Tomcat上运行)上工作,并使用JPA(Eclipselink)来完成数据层。我前段时间做过类似的事情。但是我总是不确定何时需要开始和结束交易或进行刷新。目前我使用事务(如果我添加(持久)并删除对象)。如果我在已经存在的对象上调用设置器,则不使用事务。

什么时候使用事务或如何正确实现应用程序管理的JPA,是否有指南/教程或简短答案。


问题答案:

我认为可以总结您问题的答案。几乎所有的JPA操作都需要事务,除了不锁定实体的查找/选择(即,任何不更改数据的JPA操作)。

(JTA事务范围的实体管理器) 对于JTA事务范围的实体管理器,最好从规范中引用(第3章实体操作):

当使用具有事务范围的持久性上下文的实体管理器时,必须在事务上下文中调用persist,merge,remove和refresh方法。如果没有事务上下文,则抛出javax.persistence.TransactionRequiredException。

指定除LockModeType.NONE以外的其他锁定模式的方法必须在事务上下文中调用。如果没有事务上下文,则抛出javax.persistence.TransactionRequiredException。

无需在事务上下文中调用find方法(假设它不带锁地调用或使用LockModeType.NONE调用)和getReference方法。如果使用具有事务范围持久性上下文的实体管理器,则将分离结果实体;否则,将分离结果实体。如果使用具有扩展持久性上下文的实体管理器,则将对其进行管理。有关在交易外部使用实体管理器的信息,请参见第3.3节。

(应用程序管理的/资源本地的实体管理器)
对于应用程序管理的实体管理器,JPA规范对此行为不清楚。在Hibernate的情况下,当不在事务内部时发生的事情非常复杂(它还可能取决于JDBC驱动程序和数据库连接的自动提交模式)。查看Hibernate关于该主题的文章。 基本上,强烈建议您始终对上述操作使用事务。

对于问题的第二部分:如果您调用了受管实体的setter,并且没有刷新就将其分离(即在事务提交之前),则该行为尚不清楚/不确定,即您应该更正代码。

错误代码示例:

//begin Transaction
MyEntity entity = em.find(MyEntity.class, 1L);
entity.setField("New value");
em.detach();//it is not sure whether the "New value" will be persisted. To make sure it is persisted, ypu need to call em.flush() before detaching
//commit Transaction

通常,如果数据库操作 的顺序(与实体管理器操作的顺序不同 )并不重要,则可以让JPA实现来决定何时刷新(例如,在事务提交时)。



 类似资料:
  • 问题内容: 我们目前正在使用JPA作为我们的数据访问层来开发J2EE Web应用程序。我们目前正在采用几种不同的策略来利用我们的应用程序中的缓存。 创建每个请求 在请求范围内获取缓存,但在请求结束时丢失缓存 轻松回滚整个请求中的任何更改 创建每个Http会话 在会话范围内获取缓存 使事务变得更复杂,必须按请求创建一个新事务,然后才能按请求回滚更改 我已经在Hibernate文档中看到了这两种策略。

  • 我们希望使用App Engine Admin API(REST)和Golang自动创建项目ID并安装我们的ULAPPH Cloud Desktop应用程序。https://cloud.google.com/appengine/docs/admin-api/?hl=en_US 我们能够得到一个令牌,但是当我们试图创建一个项目ID时,我们得到了下面的错误。 我们只是使用REST API调用。如上所示,

  • Windows NT Option Pack 提供了在 Web 服务器上的 ASP 应用程序管理服务。例如,Internet 服务管理器为应用程序开发人员提供了一个使用简便的管理工具来设置应用程序的属性。另外,Active Server Pages 提供了允许用户的应用程序存储全局数据的脚本功能。本主题简要介绍部分应用程序管理功能,并提供到详细信息的链接。 启动和结束应用程序 当 Web 服务器第

  • 在基于Spring的应用程序中,事务管理器负责提交或回滚SQL事务。我的应用程序对持久性数据的某些部分使用自定义缓存。这个缓存不是由Spring或Hibernate管理的。 如果SQL事务遇到错误并且必须回滚,那么缓存修改也应该回滚。 我的问题是,当Spring Transaction Manager回滚事务时,如何注册一个将调用我的方法的事件侦听器或回调?

  • 默认情况下,你会将应用程序放入application/中,并且可能用 CodeIgniter 只管理这一个应用程序。当然,多个应用程序共享一个 CodeIgniter, 甚至对 application 文件夹进行重命名或更换路径也是可行的。 对应用程序文件夹重命名 如果你要对 application 进行重命名, 你需要打开 index.php 文件,对变量 $application_folder

  • 默认情况下,CodeIgniter 假设你只有一个应用程序,被放置在 application/ 目录下。但是,你完全可以拥有多个程序并让 它们共享一份 CodeIgniter 。你甚至也可以对你的应用程序目录 改名,或将其移到其他的位置。 重命名应用程序目录 如果你想重命名应用程序目录,你只需在重命名之后打开 index.php 文件将 $application_folder 变量改成新的名字: