有没有可能在不使用ejb的情况下在pojo中使用java-ee进行事务处理?代码看起来会是什么样子?我只将pojos用于我的业务流程,而不是创建任何ejb。这样做明智吗?
提前感谢
发布于 2017-05-28 05:37:22
如果您使用的是JavaEE7,任何托管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。
您还可以@Inject UserTransaction (或在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";
}
}注意异常处理的不同。这是因为当抛出RuntimeException时,容器将自动回滚使用@Transactional创建的事务(根据JTA规范的3.7节),如果您直接使用UserTransaction,这是您的责任。
发布于 2017-05-28 00:13:59
可以在任何“容器托管”的类中使用Java事务,这允许您查找或注入对象。
我认为使用Java事务的最直接的示例是在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及其事务注释在幕后发生的事情。
https://stackoverflow.com/questions/44217246
复制相似问题