我正在使用来自独立应用程序的 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 中声明的属性 override 和 complement 值。
在实际实现中,我从proerties 文件中读取连接参数。所以不需要DataSource(如果这是客户端应用程序,希望只有一个连接,所以不需要池)。
但是,这样,您必须手动管理交易!!!一种解决方法是使用 CDI 或 AOP 拦截器将您的业务方法与事务包装起来。这需要一些努力,但可能会为您节省启动独立 EJB 容器的开销。