Java EE應用程序到EntityManager的一個參考。您不能只使用@PersistanceContext
註釋來注入它,因爲EntityManager
實例不是線程安全的。假設我們希望我們的EntityManager
在每個HTTP請求處理開始時創建,並在HTTP請求處理後關閉。我想到兩個選項:獲得我使用的Java EE 7,我想知道什麼是注入一個JPA <code>EntityManager</code>到<strong>應用程序的正確方法作用域</strong> CDI豆使用CDI
1. 創建一個引用EntityManager
的請求範圍的CDI bean,然後將該bean注入到應用程序範圍的CDI bean中。當RequestScopedBean
被破壞
import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@RequestScoped
public class RequestScopedBean {
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
}
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class ApplicationScopedBean {
@Inject
private RequestScopedBean requestScopedBean;
public void persistEntity(Object entity) {
requestScopedBean.getEntityManager().persist(entity);
}
}
在這個例子中一個EntityManager
創建RequestScopedBean
時將被創建,並且將被關閉。現在我可以將注入移動到某個抽象類,以將其從ApplicationScopedBean
中移除。
2. 創建產生的EntityManager
實例製片,然後注入EntityManager
實例到應用程序作用域CDI豆。
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
public class EntityManagerProducer {
@PersistenceContext
@Produces
@RequestScoped
private EntityManager entityManager;
}
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
@ApplicationScoped
public class ApplicationScopedBean {
@Inject
private EntityManager entityManager;
public void persistEntity(Object entity) {
entityManager.persist(entity);
}
}
在這個例子中,我們也將其創建的每個HTTP請求的EntityManager
,但對於關閉的EntityManager
? HTTP請求處理後它是否也會關閉?我知道@PersistanceContext
註釋注入容器管理的EntityManager
。這意味着當客戶端bean被銷燬時,EntityManager
將被關閉。在這種情況下,客戶端bean是什麼?它是ApplicationScopedBean
,在應用程序停止之前它不會被銷燬,或者是EntityManagerProducer
?任何建議?
我知道我可以使用無狀態EJB,而不是應用範圍的bean,然後就由@PersistanceContext
註釋注入EntityManager
,但是這不是問題的關鍵:)
我可以做到這一點,然後從工廠中的每個應用程序作用域bean的方法獲得'EntityManager'。但它會是一個容器管理的'EntityManager'嗎?我不這麼認爲。我不想管理'EntityManager'和我自己的事務的生命週期。 –
@FlyingDumpling你使用的是什麼版本的java EE?如果在Java EE 7之前,無論如何您都沒有CDI bean中的事務支持。看到這個迴應:http://stackoverflow.com/questions/17838221/jee7-do-ejb-and-cdi-beans-support-container-managed-transactions –
@AndreiI對不起,我沒有提到,我使用Java EE 7 –