#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 не совершает транзакцию.