【发布时间】:2014-02-28 15:59:28
【问题描述】:
对于冗长的背景故事感到抱歉,但我想说明我们为什么要做我们正在做的事情。
我们的应用程序当前使用 Hibernate 3.6,我们希望升级到 Hibernate 4.3。
该应用程序是专门为避免使用persistence.xml 来配置JPA 并创建EntityManagerFactory 而编写的,而是像这样使用Hibernate 的Ejb3Configuration 类(示例):
Properties properties = new Properties();
properties.put("javax.persistence.provider", "org.hibernate.ejb.HibernatePersistence");
properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL");
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
properties.put("hibernate.show_sql", "false");
properties.put("hibernate.format_sql", "true");
Ejb3Configuration cfg = new Ejb3Configuration();
cfg.addProperties(properties);
DataSource dataSource = dataSourceProvider.get();
cfg.setDataSource(dataSource);
//add the annotated classes
cfg.addAnnotatedClass(SomePersistentObject.class);
EntityManagerFactory factory = cfg.buildEntityManagerFactory();
我们这样做的原因是因为我们有一个 Web 应用程序(war 文件)部署到 Tomcat 以提供“核心”功能。然后,我们安装我们所谓的“客户端包”,它们是分解后的/WEB-INF/lib 目录中的 jar 文件。 “客户端包”包含对 Web 应用程序现有“核心”行为的覆盖。这使我们能够在 Web 应用程序的一个实例中为多个客户端提供服务,每个客户端都具有来自“核心”行为的各种自定义。我们根据传入 HTTP 请求的域或子域知道要使用哪个客户端捆绑包。
每个客户端包总是有自己的数据库实例,因此每个客户端包都定义了自己的EntityManagerFactory。架构几乎相同,但客户端包可以根据需要添加新的持久类。
所以,我们在 Java 中进行 JPA 配置的原因是,每个客户端包都扩展了“核心”类并添加了自己的实体类。 Java 非常适合继承,而 XML 很糟糕。如果我们必须通过 XML 进行配置,那么每个客户端包都需要复制核心的 persistence.xml 并从那里更新它。我宁愿使用继承而不是复制/粘贴。
我认为我们有一个非常有效的用例,可以通过 Java 而不是 XML 进行 JPA 配置。
我的问题:Hibernate 4.3 是否允许这样做?如果是这样,我该怎么做?
如果没有,是否有人对如何使我的上述场景尽可能简单,同时被 XML 配置困住有任何建议?
单个 Web 应用程序中的多个 jar 文件是否可以包含 /META-INF/persistence.xml 文件,或者是否需要以其他方式定义多个持久性单元?
谢谢!!!
-瑞恩
【问题讨论】: