簡體   English   中英

JPA:通過覆蓋數據源,在JSE和JUnit中將jp-data-source與persistence.xml一起使用

[英]JPA: Reuse persistence.xml with jta-data-source in JSE and JUnit by overriding the datasource

我有這個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>

現在,我想在具有直接JDBC連接的純Java應用程序中重用它,因此沒有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 ,它們的失敗結果與上述相同。

據我從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應用程序中執行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM