JPA 和 EJB - 什么时候需要使用事务?

2024-01-26

我正在按照一些教程学习 Java 的持久性。

我正在使用 Java EE 7 和 Payara 服务器。

我注意到每个人都使用不同的持久化方法。

例子:

  • simple

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
        }
        public void remove(Book book) {
            em.remove(book);
        }
    }
    
  • with flush(),当验证策略未设置为“AUTO”时使用持久性.xml, right?

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            em.persist(book);
            em.flush();
        }
        public void remove(Book book) {
            em.remove(book);
            em.flush();
        }
    }
    
  • 有交易

    @Stateless
    public class BookServiceBean implements BookService {
        @PersistenceContext
        private EntityManager em;
    
        public void createOrUpdate(Book book) {
            utx.begin();
            em.persist(book);
            utx.commit();
        }
        public void remove(Book book) {
            utx.begin();
            em.remove(book);
            utx.commit();
        }
    }
    

我何时以及为什么必须使用最后一个?

是否有必要使用em.close()在每个方法的最后?

有哪些好的做法?


第一个方法是没有手动刷新和事务模糊的 EJB 方法,是规范方法。默认情况下,单个 EJB 方法调用已算作单个完整事务。 EJB 容器将在调用方法之前透明地开始事务,并在方法返回时提交事务(或在方法抛出应用程序异常时回滚)。

第二个示例中的手动冲洗是不必要的。一般来说,你想使用em.flush()仅当您修改实体(即使其变得“脏”)并希望之后(间接)执行SELECT在同一笔交易中。这种情况很少见,但在现实世界中有使用案例,通常是当您愿意时SELECT脏实体是其子实体的父实体。

第三个例子中的手动事务管理是完全没有必要的。读完第一段后,您应该已经意识到这一点。仅当您不使用时才需要手动事务管理JTA, but RESOURCE_LOCAL(通常,在 Java SE 中而不是 Java EE 中)。

也可以看看:

  • 什么时候有必要或方便使用 Spring 或 EJB3 或全部一起使用? https://stackoverflow.com/questions/18369356/when-is-it-necessary-or-convenient-to-use-spring-or-ejb3-or-all-of-them-together
  • JSF 请求作用域 bean 会在每个请求上不断重新创建新的有状态会话 bean? https://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req/
  • Java EE前端方法中处理服务层异常 https://stackoverflow.com/questions/32853167/handling-service-layer-exception-in-a-jsf-listener-method/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA 和 EJB - 什么时候需要使用事务? 的相关文章

  • 具有自定义集合属性的 JPA 投影

    我们正在使用 Spring Data 并尝试使用子查询创建自定义查询 结果投影有一个数组和其他属性 我们的问题在于子查询数组 public interface ProfesionalRepository extends JpaReposit
  • Tomcat 基于表单的身份验证出现 HTTP 状态 408 错误

    我的申请是写在JSP并且有基于表单的身份验证 我正在使用 Apache 和 Tomcat 7 这是我的问题 有时 当会话超时并尝试重新登录应用程序时 它会显示以下 408 错误消息 HTTP 状态 408 已超出登录过程允许的时间 如果您想
  • 在 Eclipse 中生成 POJO 的所有 setXXX 调用?

    我目前正在对 JPA 实体进行大量测试 其中我必须不断调用实体上的 setter 方法 如下所示 myEntity setXXX value myEntity setYYY value myEntity setZZZ value Eclip
  • JPA 乐观锁与同步 Java 方法

    使用 JPA 乐观锁定 我们可以通过 Version 字段控制数据库表是否已被另一个事务同时更新 从而允许在数据库中存储可靠的数据 如果一个Java应用程序只有一个CRUD服务负责数据库中的特定实体 我们也可以同步其方法并管理信息在数据库中
  • PostgreSQL 锁定机制中的错误或对该机制的误解

    我们遇到了 PostgreSQL 9 0 12 锁定机制的问题 这是我们重现该问题的最小代码 Scenario Transaction 1 Transaction 2 BEGIN BEGIN select trees for update
  • Java 事务 API (JTA) 概述帮助

    有人可以给我一个关于 JTA 在现代 Java 应用程序中的动机和应用的很好的解释吗 我不需要过多的技术细节 但只是一段关于为什么我们需要 JTA JTA 能完成什么 也许还有一段伪代码显示如何使用 JTA 通常 应用程序对数据库 JMS
  • 重复键错误不会取消/回滚mysql事务

    当在 mysql innodb 事务中时 我希望重复的键错误会导致回滚 它没有 相反 它只是抛出一个错误并继续执行下一个命令 一旦到达 COMMIT 命令 事务将被提交 没有重复键导致命令 这是预期的行为吗 如果是这样 如何设置它以便在发生
  • Java EE 6 的 Maven 与 Eclipse 项目 Facets

    我在 Eclipse 中使用以下原型创建了 Maven 项目 ejb javaee6 webapp javaee6 这些项目是在没有方面的情况下创建的 将此类 Maven 项目转换为多面形式有意义吗 哪些方面会有帮助 哪些方面可能会给 Ma
  • “纯”MVC 实现有多大用处?

    我在一家提供类似 CRM 的定制软件的公司工作 我们目前正在重新设计 重新开发该软件 希望它看起来更现代 并且更容易为未来的客户开发和定制 目前 定制每个新应用程序都需要很长时间 有一种假设是 花费这么长时间的原因是 视图 层中存在大量业务
  • 无法获取 ConfigBean 中实体的正确 ID - Java EE

    我正在构建一个药房管理应用程序 每个药房都需要一名管理员 约束是这样的 public class Pharmacy implements Serializable Id GeneratedValue strategy GenerationT
  • 验证错误值无效[重复]

    这个问题在这里已经有答案了 我知道这是一个常见的错误 并且有很多关于它的问题 但我必须创建一个新的问题 这是我的 jsf 页面
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • TransactionScope 的细微差别

    假设我有两个线程 它们在特定于线程的 TransactionScope 中执行一些面向数据库的代码 并具有 ReadCommissed 隔离级别 但是有一些表的数据应该共享 不应创建重复项 using var transactionScop
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 在单个更新语句上使用事务

    我在工作中为一些 SP 配音 我发现编写代码的人在单个更新语句上使用了事务 如下所示 begin transaction single update statment update table whatever with whatever
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • Spring、JPA 和 Hibernate - 如何在没有并发问题的情况下增加计数器

    我正在使用 Spring 和 JPA Hibernate 但我对增加表中计数器的正确方法有点困惑 我的 REST API 需要根据用户操作增加和减少数据库中的某些值 在下面的示例中 喜欢或不喜欢标签将使标签表中的计数器增加或减少 1 tag
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • Spring @Transactional 并发

    class MyService 公共无效a 同步 某个键 b Transactional 传播 传播 REQUIRES NEW 公共无效b 数据库工作吗 除非您使用代码编织 否则这是行不通的 Spring处理事务的默认方式是通过AOP代理

随机推荐