是否可以在不使用ejb的情况下在pojo内部执行java-ee中的事务?代码怎么样? 我只使用pojos来处理业务流程而不创建任何ejb。这是明智的吗?
提前致谢
答案 0 :(得分:2)
如果您使用的是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
。
您还可以@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";
}
}
注意异常处理的不同之处。这是因为如果您直接使用@Transactional
,则容器会在引发RuntimeException
时自动回滚使用UserTransaction
创建的事务(根据JTA规范第3.7节)。< / p>
答案 1 :(得分:1)
可以在任何“#container; container managed&#34;”的类中使用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及其事务注释的内容。