2017-05-27 75 views
0

是否有可能在不使用ejb的情況下在pojo內的java-ee中執行事務?代碼如何看起來像? 我只爲我的業務流程使用pojos,而不是創建任何ejb。這是明智的嗎?pojo中的Java-ee事務

在此先感謝

+0

這個類將如何被調用?通過一個EJB,一個servlet,......? – fvu

+2

只有從一個cdi – pumukel

回答

1

它可以使用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和他們交易的註釋被窩裏怎麼回事。

2

如果您正在使用Java EE 7,則任何託管bean(或bean方法)都可以使用@Transactional註釋使容器管理事務。所以這將適用於WebServlet,任何注入的bean/pojo以及EJB。下面是一個JAX-RS的controller 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交易persist操作來存儲Person在數據庫中。

您還可以@InjectUserTransaction(或看它在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"; 

    } 
} 

注意異常處理的區別。這是因爲如果您直接使用UserTransaction這是您的責任,則當投擲RuntimeException(根據JTA規範第3.7節)時,容器將自動回滾使用@Transactional創建的交易。