我正在使用來自獨立應用程序的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容器的開銷。