JPA: повторное использование файла persistence.xml с источником данных jta в JSE и JUnit путем переопределения источника данных.

У меня есть этот 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_class и hibernate.connection.datasource, с теми же неудачными результатами, что и выше.


person Geoffrey De Smet    schedule 25.07.2018    source источник
comment
Связанная jira   -  person Geoffrey De Smet    schedule 25.07.2018


Ответы (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.

Это может быть глупой идеей, но разве вы не можете просто сделать наоборот, т.е. не устанавливать источник данных в вашем блоке персистентности, а установить его через файл hibernate.properties в вашем приложении WildFly? Затем вы можете делать все, что хотите, в своем обычном Java-приложении.

person yrodiere    schedule 25.07.2018