JPA: นำ Peristence.xml มาใช้ซ้ำกับ jta-data-source ใน 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
จิระที่เกี่ยวข้อง   -  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