Jakarta ee pojo中的javaee事务
可以在pojo中使用JavaEE进行事务处理而不使用ejb吗?代码是什么样子的? 我的业务流程只使用POJO,不创建任何ejb。这明智吗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
提前感谢可以在任何“容器管理”的类中使用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