EclipseLink v2.7.9 не создает таблицы в Postgres v13.3, когда автокоммиссия ложна

#postgresql #jpa #eclipselink

Вопрос:

 EclipseLink - v2.7.9
Postgres - v13.3
Postgres JDBC Client - v42.2.22
HikariCP - v4.0.3
JDK - v11.0.11
OS - macOS
 

Я установил автоматическую фиксацию в значение false и использовал свойство EclipseLink <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/> , но таблицы не создаются в Postgres, в то время как они создаются в MySQL с теми же настройками.

Это происходит только тогда, когда я использую источник данных, такой как HikariDataSource, или пользовательское расширение org.postgresql.ds.PGSimpleDataSource with autoCommit как false.

Расширение PGSimpleDataSource для установки автоматической фиксации как false.

 public class MyPGSimpleDataSource extends PGSimpleDataSource {
    @Override
    public Connection getConnection() throws SQLException {
        Connection connection = super.getConnection();
        connection.setAutoCommit(false);
        return connection;
    }
}
 

Но когда я устанавливаю autoCommit в значение true, таблицы успешно генерируются в Postgres.

Однако EclipseLink генерирует таблицы в MySQL v8.0.25 независимо от того, является ли автоКоммит истинным или ложным.

Я также попытался повторить проблему с Hibernate v5.5.2 и обнаружил, что таблицы генерируются даже при автоматической фиксации как ложные.

Я передаю источник данных на карте свойств сохраняемости, и ниже добавляется свойство EclipseLink для создания EntityManagerFactory с нетерпением.

 <property name="eclipselink.deploy-on-startup" value="true"/>
 

Простой источник данных для тестирования этого варианта использования

 PGSimpleDataSource ds = new MyPGSimpleDataSource();
ds.setServerNames(null);
ds.setPortNumbers(null);
ds.setUser("postgres");
ds.setPassword("******);
ds.setDatabaseName("JPA");
Map<String, Object> properties = new HashMap<>();
properties.put("javax.persistence.nonJtaDataSource", ds);

EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory("AdeptJ_PU_Postgres", properties);
 

persistence.xml для EclipseLink

 <persistence-unit name="AdeptJ_PU_Postgres" transaction-type="RESOURCE_LOCAL">

        <!-- JPA Entities -->
        <class>com.adeptj.modules.data.jpa.entity.User</class>
        <class>com.adeptj.modules.data.jpa.entity.Address</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>NONE</shared-cache-mode>

        <properties>
            <property name="eclipselink.deploy-on-startup" value="true"/>
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
            <property name="eclipselink.ddl-generation.output-mode" value="database"/>
            <property name="eclipselink.logging.file" value="jpa.log"/>
            <property name="eclipselink.logging.level" value="FINEST"/>
            <property name="eclipselink.exception-handler" value="com.adeptj.modules.data.jpa.JpaExceptionHandler"/>
        </properties>
    </persistence-unit>
 

Минимальный persistence.xml для тестирования в режиме гибернации

 <persistence-unit name="AdeptJ_PU_Postgres" transaction-type="RESOURCE_LOCAL">

        <!-- JPA Entities -->
        <class>com.adeptj.modules.data.jpa.entity.User</class>
        <class>com.adeptj.modules.data.jpa.entity.Address</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>NONE</shared-cache-mode>

        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>
 

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Комментарии:

1. По-видимому, Eclipselink не совершает транзакцию.