web-dev-qa-db-fra.com

La méthode d'erreur Postgres org.postgresql.jdbc.PgConnection.createClob () n'est pas implémentée

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?

8
Nirav Patel

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:

  1. Mettez à jour votre pilote postgressql avec une version plus récente compatible avec les versions antérieures.
  2. Définissez hibernate.jdbc.lob.non_contextual_creation=true dans votre persistence.xml
  3. Si cela ne fonctionne pas voir cette astuce ci-dessous:

La 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é

13
KeyMaker00

PostgreSQL n'a pas vraiment "CLOB". Utilisez simplement setString(String) ou setObject(...) avec Types.STRING.

0
Craig Ringer