【问题标题】:JPA: Reuse persistence.xml with jta-data-source in JSE and JUnit by overriding the datasourceJPA:通过覆盖数据源在 JSE 和 JUnit 中重用 persistence.xml 和 jta-data-source
【发布时间】:2019-01-02 00:13:36
【问题描述】:

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

  <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,结果与上述相同。

【问题讨论】:

标签: java hibernate jpa wildfly


【解决方案1】:

据我所知,从 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 的 Map 的设置。

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

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多