JPA: Gunakan kembali persistence.xml dengan jta-data-source di JSE dan JUnit dengan mengganti sumber data

Saya memiliki peristence.xml ini yang diterapkan di WildFly:

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

Sekarang saya ingin menggunakannya kembali dalam aplikasi Java biasa, dengan koneksi JDBC langsung, jadi tanpa 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);

Bagaimana cara menimpa jta-data-source?


Saya sudah mencoba sejumlah properti JPA untuk mengganti jta-data-source, tetapi tidak berhasil:

    // 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");

Saya juga mencoba sejumlah properti khusus hibernasi, seperti hibernate.transaction.coordinator_class dan hibernate.connection.datasource dengan hasil gagal yang sama seperti di atas.


person Geoffrey De Smet    schedule 25.07.2018    source sumber
comment
Jira terkait   -  person Geoffrey De Smet    schedule 25.07.2018


Jawaban (1)


Sejauh yang saya tahu dari sumber Hibernate ORM (khususnya 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)), pengaturan JPA khusus ini mengesampingkan pengaturan dari hibernate.properties atau dari Peta yang akan Anda berikan ke Persistence.createEntityManagerFactory.

Ini mungkin ide yang bodoh, tetapi tidak bisakah Anda melakukan yang sebaliknya, yaitu tidak menyetel sumber data di unit persistensi Anda, tetapi menyetelnya melalui file hibernate.properties di aplikasi WildFly Anda? Kemudian Anda dapat melakukan apapun yang Anda inginkan di aplikasi java biasa Anda.

person yrodiere    schedule 25.07.2018