【问题标题】:Hibernate: Replacement for Ejb3Configuration ClassHibernate:替换 Ejb3Configuration 类
【发布时间】: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 文件,或者是否需要以其他方式定义多个持久性单元?

谢谢!!!

-瑞恩

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我不确定有多少高级开发人员会推荐这种方法,而不是使用 API 从(动态)源实现所需的实体工厂和配置。
    • @DarrellTeague,您能否指出一些有关如何使用供应商中立 API 来完成此操作的文档?动态编写persistence.xml 也不是我的第一选择,但我不知道如何使用JPA 或Hibernate API 来实现。我必须远离供应商特定的 API,因为我们使用多个 JPA 提供程序。我确信 JPA 提供了一种方法来做到这一点,我只是不知道怎么做。
    • Persistence 类的 createEntityManagerFactory 方法可用于获取命名持久性单元和属性映射的 EntityManager 工厂实例。 docs.oracle.com/javaee/7/api/javax/persistence/…。请注意,前面引用的 Ejb3Configuration 最近已被弃用,以代替这种 JPA 标准化方法。另见stackoverflow.com/questions/16939415/…
    猜你喜欢
    • 1970-01-01
    • 2015-11-29
    • 2023-03-17
    • 2012-02-03
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2014-08-17
    相关资源
    最近更新 更多