最好的方法是抽象你的 DAO 层。您提供如下界面:
public interface Dao {
void persist(E entity);
void remove(E entity);
E findById(K id);
}
提供它的抽象实现为
public abstract class JpaDao implements Dao {
protected Class entityClass;
@PersistenceContext
protected EntityManager entityManager;
//so on.. and delegate calls to entity manager.
现在提供另一个依赖于 JDBC DB 管理器单例的 DAO 实现。
public abstract class JDBCDao implements Dao {
protected MyDBManager dbManager;
//delegate calls to db manager
现在实现所有特定于功能的 DAO;分别用于 JPA 基类和 JDBC 基类。
实现一个abstract factory,它可以根据您需要 JPA 家族还是 JDBC 家族来为您创建各种 DAO。
完成后,使用工厂定义您的 daos,例如:
<!-- factory instance to create JPA family of DAOs -->
<bean id="myJPADaoFactory"
class="AbstractDAOFactory">
<!--other init parameters specific to JPA -->
<!-- factory instance to create JDBC family of DAOs -->
<bean id="myJDBCaoFactory"
class="AbstractDAOFactory">
<!-- other init parameters specific to JDBC -->
现在将您的 DAO bean 定义为:
<bean id="exampleDaoBean"
factory-bean="#{systemProperties.dao.config}"
factory-method="createExampleDAO"/>
注意,factory-bean 是一个动态参数,要从System.properties 加载
当您启动应用程序时,使用参数 dao.config 将开关传递给 JVM,并使用 -D 参数。
因此,例如,当您想使用基于 JPA 的 DAO 时,您可以将 java 运行为:
java -Ddao.config="myJPADaoFactory" <Your App>
如果您使用的是应用服务器,则需要编辑其特定的配置文件以传递 -D 参数。例如,在 tomcat 中,这可以通过 CATALINA_OPTS 变量设置。这在很大程度上取决于您使用的应用服务器。