我正在创建一个基于JPA的应用程序,我需要在许多不同的地方使用EntityManger。所以我正在创建一个返回实体管理器的单例类:
class MyDB {
static EntityManger getEM() {
...
}
}
我想将它用于测试和生产环境。为了测试,我想添加一个方法setTestEnvironment(),以确保使用TEST数据库。 (这必须在第一次getEM()调用之前调用。)
选择生产数据库或测试数据库的最佳方法是什么。我可以在persistence.xml中添加多个持久性单元吗?还有什么其他选择?
答案 0 :(得分:1)
我们使用Spring,它通过注释@PersistenceContext使事情变得非常简单,它可以选择性地使用persistence.xml中的持久性单元,并提供不错的测试框架,如JUnit。
@PersistenceContext
public EntityManager entityManager;
Singletons很难测试(你必须添加像setForTest()和resetForTest()这样的东西,也称为 singletonitus 。投入时间来使用IoC容器(spring或google guice)可以使重构,测试和扩展代码变得更加容易。
答案 1 :(得分:1)
如果您在应用程序服务器中运行 - 或者甚至是诸如Tomcat之类的servlet容器 - 您只需通过容器处理连接详细信息即可。
在Tomcat中,您可以在Web应用程序的上下文XML文件中指定它,并在持久性XML中使用资源的完整JNDI名称。
答案 2 :(得分:0)
最后,正如我最初的问题所示,我创建了一个单独的(单例)类,可以先调用它来设置正确的数据库:
public static void setEnvironment(ApplicationEnvironment env) {
environment = env;
}
public enum ApplicationEnvironment {
UNKNOWN, PRODUCTION, TEST, DEVELOPMENT
}
根据设置环境,选择正确的持久性单元:
Persistence.createEntityManagerFactory(getEMFactoryParameter());
...
public String getEMFactoryParameter() {
if(environment == ApplicationEnvironment.DEVELOPMENT) {
return "mydb_dev";
} else if(environment == ApplicationEnvironment.TEST) {
return "mydb_test";
} else {
return "mydb_prod";
}
}