Jakarta ee pojo中的javaee事务

Jakarta ee pojo中的javaee事务,jakarta-ee,ejb,Jakarta Ee,Ejb,可以在pojo中使用JavaEE进行事务处理而不使用ejb吗?代码是什么样子的? 我的业务流程只使用POJO,不创建任何ejb。这明智吗 提前感谢可以在任何“容器管理”的类中使用Java EE事务,这允许您查找或注入对象 我认为使用Java EE事务最简单的例子是在servlet中使用JNDI查找: public class MyServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpSer

可以在pojo中使用JavaEE进行事务处理而不使用ejb吗?代码是什么样子的? 我的业务流程只使用POJO,不创建任何ejb。这明智吗


提前感谢

可以在任何“容器管理”的类中使用Java EE事务,这允许您查找或注入对象

我认为使用Java EE事务最简单的例子是在servlet中使用JNDI查找:

public class MyServlet extends HttpServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    UserTransaction tran = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    tran.begin();
    // do some stuff
    tran.commit();
  }
}

这基本上就是EJB及其事务注释的封面下所发生的事情。

可以在任何“容器管理”的类中使用Java EE事务,这允许您查找或注入对象

我认为使用Java EE事务最简单的例子是在servlet中使用JNDI查找:

public class MyServlet extends HttpServlet {
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    UserTransaction tran = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
    tran.begin();
    // do some stuff
    tran.commit();
  }
}

这基本上就是EJB及其事务注释的幕后运作。

如果您使用的是Java EE 7,任何托管bean(或bean方法)都可以使用
@Transactional
注释让容器管理事务。因此,这将适用于WebServlet、任何注入的bean/pojo以及EJB。以下是JAX-RS控制器bean的示例:

@Path("/debug")
public class DebugController {

    @PersistenceContext
    EntityManager entityManager;

    @GET
    @Transactional
    public String insertPerson() {

        Person person = new Person();
        person.setName("peter");
        entityManager.persist(person);
        return "OK";

    }
}
在这种情况下,容器将创建和管理JPA的
EntityManager
Person持久化操作所需的事务,以在数据库中存储
Person

您还可以
@Inject
插入
用户事务
(或在JNDI中查找)并自己管理事务的范围,但是这需要您的事务资源显式地加入事务,在这种情况下,示例如下所示:

@Path("/debug")
public class DebugController {

    @PersistenceContext
    EntityManager entityManager;

    @Inject
    UserTransaction utx;

    @GET
    public String insertPerson() throws Exception {

        utx.begin();
        try {
            entityManager.joinTransaction();
            Person person = new Person();
            person.setName("peter");
            entityManager.persist(person);
            utx.commit();
        } catch (RuntimeException e) {
            utx.rollback();
            throw e;
        }
        return "OK";

    }
}

请注意异常处理中的差异。这是因为当抛出
运行时异常时(根据JTA规范第3.7节),容器将自动回滚使用
@Transactional
创建的事务,如果您直接使用
UserTransaction
,这是您的责任。

如果您使用的是Java EE 7,则任何托管bean(或bean方法)可以使用
@Transactional
注释让容器管理事务。因此,这将适用于WebServlet、任何注入的bean/pojo以及EJB。以下是JAX-RS控制器bean的示例:

@Path("/debug")
public class DebugController {

    @PersistenceContext
    EntityManager entityManager;

    @GET
    @Transactional
    public String insertPerson() {

        Person person = new Person();
        person.setName("peter");
        entityManager.persist(person);
        return "OK";

    }
}
在这种情况下,容器将创建和管理JPA的
EntityManager
Person
持久化操作所需的事务,以在数据库中存储
Person

您还可以
@Inject
插入
用户事务
(或在JNDI中查找)并自己管理事务的范围,但是这需要您的事务资源显式地加入事务,在这种情况下,示例如下所示:

@Path("/debug")
public class DebugController {

    @PersistenceContext
    EntityManager entityManager;

    @Inject
    UserTransaction utx;

    @GET
    public String insertPerson() throws Exception {

        utx.begin();
        try {
            entityManager.joinTransaction();
            Person person = new Person();
            person.setName("peter");
            entityManager.persist(person);
            utx.commit();
        } catch (RuntimeException e) {
            utx.rollback();
            throw e;
        }
        return "OK";

    }
}

请注意异常处理中的差异。这是因为当抛出
运行时异常时(根据JTA规范第3.7节),容器将自动回滚使用
@Transactional
创建的事务,如果您直接使用
UserTransaction
,这是您的责任。

该类将如何/在何处调用?通过一个EJB,一个servlet,…?只从一个cdiHow/将在哪里调用该类?通过EJB,servlet,…?仅来自cdi