是否有可能在不使用ejb的情況下在pojo內的java-ee中執行事務?代碼如何看起來像? 我只爲我的業務流程使用pojos,而不是創建任何ejb。這是明智的嗎?pojo中的Java-ee事務
在此先感謝
是否有可能在不使用ejb的情況下在pojo內的java-ee中執行事務?代碼如何看起來像? 我只爲我的業務流程使用pojos,而不是創建任何ejb。這是明智的嗎?pojo中的Java-ee事務
在此先感謝
它可以使用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的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
在數據庫中。
您還可以@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";
}
}
注意異常處理的區別。這是因爲如果您直接使用UserTransaction
這是您的責任,則當投擲RuntimeException
(根據JTA規範第3.7節)時,容器將自動回滾使用@Transactional
創建的交易。
這個類將如何被調用?通過一個EJB,一個servlet,......? – fvu
只有從一個cdi – pumukel