我的問題其實很簡單,但我真的找不到一個好的解決方案。動態創建EntityManager
我目前已經在我的應用程序管理多個DB:
- 一個唯一的管理數據庫(一個靜態名);
- 一個客戶端數據庫,其名稱取決於客戶端。
我正在使用JPA,我想爲客戶端數據庫創建動態EntityManagers。但是,當我以編程方式創建此代碼時,出現此錯誤: javax.persistence.TransactionRequiredException:已在資源本地EntityManager上調用joinTransaction,該資源本地EntityManager無法註冊JTA事務。
下面是代碼:
@Stateful
public class ServiceImpl implements Service{
private EntityManagerFactory emf;
private EntityManager em;
@PostConstruct // automatically called when EJB constructed and session starts
public void init() {
emf = Persistence.createEntityManagerFactory("punit");
em = emf.createEntityManager();
}
...
而且
@Stateful(mappedName = "CustomerService")
public class CustomerServiceImpl extends ServiceImpl implements CustomerService {
@Override
public void create(Customer cust) {
getEm().joinTransaction();
getEm().persist(cust);
}
更一般地,我心中已經有問題JPA。我只想連接到兩個數據庫,對它們執行一些CRUD操作。但我真的不知道如何管理交易(我的第一種方法是讓容器管理它......)。
如果有人能幫助我,可能會很棒!
注意:我正在使用Glassfish Java EE服務器和PGSql DB。
感謝您的回答。是的,我知道這種方法,但我不知道客戶端數據庫的名稱(數據庫的選擇將由應用程序完成)。所以我不能使用@PersistenceContext註釋,它需要一個靜態名稱。 – piro2
檢查編輯?從注入的EMF創建EntityManager時,您可以在哪裏提供連接屬性?難道這不能解決動態表問題? – maress
是的,我檢查了它。 但是,如果我注入一個EMF,我必須指出unitName屬性:我不能這樣做,因爲我不知道持久單元的名稱,這是一個動態參數 – piro2