pojo中的Java-ee事务

时间:2017-05-27 13:06:42

标签: java-ee ejb

是否可以在不使用ejb的情况下在pojo内部执行java-ee中的事务?代码怎么样? 我只使用pojos来处理业务流程而不创建任何ejb。这是明智的吗?

提前致谢

2 个答案:

答案 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及其事务注释的内容。