Lorsque j'appelle la méthode createClob à l'aide d'un objet de connexion, comme indiqué ci-dessous
Clob clob = con.createClob();
L'exception suivante est levée.
Caused by: Java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.
at org.postgresql.Driver.notImplemented(Driver.Java:659)
at org.postgresql.jdbc.PgConnection.createClob(PgConnection.Java:1246)
at org.Apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.Java:868)
at org.Apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.Java:868)
J'utilise la base de données PostgreSQL 9.6.2 avec JDK8 et utilise le pool de connexions commons-dbcp2.
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.1.1</version>
</dependency>
Dans la classe org.postgresql.jdbc.PgConnection
, l'implémentation de createClob est comme indiqué ci-dessous, ce qui déclenche l'exception.
@Override
public Clob createClob() throws SQLException {
checkClosed();
throw org.postgresql.Driver.notImplemented(this.getClass(), "createClob()");
}
Quelle est la solution ou solution de contournement pour surmonter ce problème? Ou comment définir les données CLOB dans les requêtes Postgres?
TL; DR
Définissez hibernate.jdbc.lob.non_contextual_creation=true
dans votre persistence.xml
C'est une erreur connue de la communauté JBoss.
Cette erreur apparaît dans les anciennes versions et dans les nouvelles versions avec Spring-Boot 2.0.0.RC1 et versions ultérieures.
Solution:
hibernate.jdbc.lob.non_contextual_creation=true
dans votre persistence.xmlLa solution consiste à ajouter cette ligne dans votre fichier de propriété (ou quelque chose de similaire si vous n'utilisez pas Spring).
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults= false
Ainsi, votre application.yml devrait ressembler à:
spring:
application:
name: employee-service
datasource:
url: jdbc:postgresql://localhost:5432/db_development
platform: POSTGRESQL
username: ...
password: ...
jpa:
hibernate:
ddl-auto: create-drop
dialect: org.hibernate.dialect.PostgreSQL9Dialect
show_sql: true
properties.hibernate.temp.use_jdbc_metadata_defaults: false
server:
port: 8080
Référence:
https://o7planning.org/fr/11661/spring-boot-jpa-and-spring-transaction-tutorial
hibernate avec c3p0: createClob () n'est pas encore implémenté
PostgreSQL n'a pas vraiment "CLOB". Utilisez simplement setString(String)
ou setObject(...)
avec Types.STRING
.