gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:20:11 24 4
gpt4 key购买 nike

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

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

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

示例:

  • 简单

    @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);
    }
    }
  • 使用flush(),当验证策略未在persistene.xml中设置为“AUTO”时使用,对吗?

    @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 容器将在调用方法之前透明地开始事务,并在方法返回时提交事务(或在方法抛出应用程序异常时回滚)。

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

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

另请参阅:

关于JPA 和 EJB - 什么时候需要使用事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36664976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com