Hibernate:Ejb3Configuration类的替换

use*_*372 5 java hibernate jpa

对于长篇故事感到抱歉,但我想知道为什么我们正在做我们正在做的事情.

我们的应用程序目前使用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();
Run Code Online (Sandbox Code Playgroud)

我们这样做的原因是因为我们有一个部署到Tomcat的Web应用程序(war文件),它提供了"核心"功能.然后,我们在展开的/WEB-INF/lib目录中安装我们称之为"客户端软件包"的jar文件."客户端捆绑包"包含对Web应用程序的现有"核心"行为的覆盖.这允许我们在Web应用程序的一个实例中为多个客户端提供服务,每个客户端都具有来自"核心"行为的各种自定义.我们知道要根据传入HTTP请求的域或子域使用哪个客户端捆绑包.

每个客户端包总是获得自己的数据库实例,因此每个客户端包定义自己的数据库实例EntityManagerFactory.模式几乎相同,但客户端包可以根据需要添加新的持久化类.

因此,我们在Java中进行JPA配置的原因是每个客户端包都扩展了"核心"类并添加了自己的实体类.XML非常适合继承,而XML很糟糕.如果我们必须通过XML进行配置,那么每个客户端捆绑包都需要复制核心persistence.xml并从那里更新它.我宁愿使用继承而不是复制/粘贴.

我认为我们有一个非常有效的用例来优先选择通过Java而不是XML的JPA配置.

我的问题:Hibernate 4.3是否以任何方式允许这样做?如果是这样,我该怎么办呢?

如果没有,是否有人建议如何使我的上述场景尽可能简单,同时坚持使用XML配置?

单个Web应用程序中的多个jar文件是否可以包含/META-INF/persistence.xml文件,还是需要以另一种方式定义多个持久性单元?

谢谢!!!

-Ryan

use*_*372 2

persistence.xml我通过在 JPA 引导之前 动态地将新文件写入 Web 应用程序的类路径来解决这个问题。

当 Web 应用程序启动时,将读取所有客户端捆绑包的 JPA 配置,然后将单个persistence.xml文件写入类路径。每个客户端包都有自己的条目作为persistence-unitinside persistence.xml

然后,在写入新persistence.xml内容后,JPA 将被引导。显然,JPA 不知道也不关心该persistence.xml文件是动态写入的。

这看起来有点像黑客,但我想不出任何其他方法来做到这一点。一个很好的好处是它让我远离 Hibernate 特定的 API,因此如果我想切换到 DataNucleus 之类的东西作为 JPA 提供程序,我将可以灵活地这样做。