2014-02-07 45 views
0

我有我的j2ee應用程序,並且我設計了一個使用JPA在數據庫上存儲項目的EJB模塊。在這個EJB包中,我有persistence.xml,指的是通常由應用程序服務器提供的JTA數據源。獨立應用程序中的JPA,EJB和JTA

現在我必須構建另一個只使用我的應用程序的EJB模塊的應用程序。它是一個獨立的應用程序,所以沒有j2ee服務器。 我該怎麼做?我需要一個EJB容器和一個JPA提供程序,我非常瞭解這一點,但我還需要在ejb jar中的persistence.xml中定義的jndi中提供數據源。我也在我的ejb包中使用容器管理的事務和依賴注入,並且我希望所有的東西都可以像j2ee那樣工作,而不需要修改ejb模塊。

回答

1

我正在使用來自獨立應用程序的JEE JPA模塊進行測試,但想法是相同的。有一種方法,EntityManagerFactory createEmf()中,創建EntityManagerFactory如下:

public static EntityManagerFactory createEmf() { 
    try { 
     HashMap<String,String> cfg = new HashMap<String,String>(); 

     String connUrl = ...; 
     String userName = ...; 
     String password = ...; 

     cfg.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect"); 
     cfg.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); 

     cfg.put("javax.persistence.transactionType", "RESOURCE_LOCAL"); 
     cfg.put("hibernate.connection.username", userName); 
     cfg.put("hibernate.connection.password", password); 
     cfg.put("hibernate.connection.url", connUrl); 
     // worked for Hibernate 4.0.1; doesn't work for 4.3: 
     //cfg.put("javax.persistence.jtaDataSource", ""); 
     // works for 4.3: 
     cfg.put("javax.persistence.jtaDataSource", null); 
     cfg.put("hibernate.hbm2ddl.auto", "create"); 
     cfg.put("hibernate.show_sql", "true"); 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("xxxxxPU",cfg); 
     return emf; 
    } 
    catch(RuntimeException re) { 
     throw re; 
    } 
    catch(Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

核心是Persistence.createEntityManagerFactory(name,properties)方法。屬性覆蓋補碼persistence.xml中聲明的值。

在實際的實現中,我從proerties文件讀取連接參數。所以不需要DataSource(希望只有一個連接,如果這是一個客戶端應用程序,所以不需要池)。

但是,這種方式,你必須手動管理交易!解決方法是使用CDI或AOP攔截器將業務方法與事務包裝在一起。這需要一些努力,但可能會爲您節省啓動獨立EJB容器的開銷。