首页 > 解决方案 > JPA:通过覆盖数据源在 JSE 和 JUnit 中重用 persistence.xml 和 jta-data-source

问题描述

我有这个peristence.xml部署在 WildFly 上:

  <persistence-unit name="optaweb-employee-rostering-persistence-unit" transaction-type="JTA">
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    ...
  </persistence-unit>

现在我想在一个普通的 Java 应用程序中重用它,使用直接的 JDBC 连接,所以没有 JNDI

    Map<String, String> properties = new HashMap<>();
    properties.put("javax.persistence.jdbc.driver", "org.hsqldb.jdbcDriver");
    properties.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:testdb");
    properties.put("javax.persistence.jdbc.user", "sa");
    properties.put("javax.persistence.jdbc.password", "");

    // Overwrites transaction-type successfully 
    properties.put("javax.persistence.transactionType", "RESOURCE_LOCAL");

    // TODO overwrite jta-data-source

    EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(
            "optaweb-employee-rostering-persistence-unit", properties);

我该如何覆盖jta-data-source


我尝试了许多 JPA 属性来覆盖jta-data-source,但没有成功:

    // Overwrites jta-data-source
    // but triggers a JNDI lookup of "" which crashes of course
    properties.put("javax.persistence.jtaDataSource", "");
    // Does not overwrite jta-data-source
    properties.put("javax.persistence.jtaDataSource", null);

    // Does not overwrite jta-data-source
    properties.put("javax.persistence.nonJtaDataSource", "foo");

我还尝试了一些休眠特定属性,例如hibernate.transaction.coordinator_classhibernate.connection.datasource上面相同的失败结果。

标签: javahibernatejpawildfly

解决方案


据我所知,从 Hibernate ORM 的来源(特别是org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl#EntityManagerFactoryBuilderImpl(org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor, java.util.Map, java.lang.ClassLoader, org.hibernate.boot.registry.classloading.spi.ClassLoaderService))来看,这些特定的 JPA 设置会覆盖hibernate.properties您将提供给Persistence.createEntityManagerFactory.

这可能是一个愚蠢的想法,但你不能做相反的事情,即不在你的持久性单元中设置数据源,而是通过hibernate.properties你的 WildFly 应用程序中的一个文件来设置它?然后你可以在你的普通 java 应用程序中做任何你想做的事情。


推荐阅读