這個 org.postgresql.jdbc.PgConnection.createClob() 方法尚未被實作
application.properties
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://10.18.35.155:5432/test1?useSSL=false
spring.datasource.username=abc
spring.datasource.password=abc
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
---------------------
參考https://stackoverflow.com/questions/49683434/spring-boot-app-fails-method-org-postgresql-jdbc4-jdbc4connection-createclob-i
https://github.com/pgjdbc/pgjdbc/issues/1102
---------------------------------------
參考:http://www.cnblogs.com/rim99/p/8672909.html
首先,配置好POM,使用默認配置啟動的時候會報一個錯誤。
java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.
根據網上查到的資料,這個是由於:Hibernate嘗試驗證PostgreSQL的CLOB特性,但是PostgreSQL的JDBC驅動並沒有實現這個特性,所以拋出了異常。
解決方法是:關閉這個特性的檢測。在配置文件里添加如下內容:
spring: jpa: # Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details. properties.hibernate.temp.use_jdbc_metadata_defaults: false # Because detection is disabled you have to set correct dialect by hand. database-platform: org.hibernate.dialect.PostgreSQL9Dialect
接下來,服務可以正常啟動了。但是在存表的時候卻有一個報錯:
org.postgresql.util.PSQLException: ERROR: relation "hibernate_sequence" does not exist
這個報錯的原因是領域類里面設定了主鍵為自增類型,標記了注解@GeneratedValue
。這個注解的默認自增類型是GenerationType.AUTO
。如果注解的自增類型是AUTO
,對於PostgreSQL,Hibernate會默認識別為GenerationType.SEQUENCE
。這時就需要一張序列表。如果Hibernate找不到指定的序列表或者沒有指定序列表,就會查找名為hibernate_sequence
的序列表。如果數據庫里沒有這張序列表,就會報上面這個錯。
不像MySQL的列可以有AUTO_INCREMENT
屬性表示自增,PostgreSQL默認使用的是序列sequence
來實現類似功能。sequence
是一種特殊的單行表,用於生成序列數字。
看這里:"hibernate_sequence" does not exist。
哎,本來一張表的事情,要用兩張表來完成,好麻煩~~~
不過,PostgreSQL已經完善了這個問題,提供一種“偽“類型——serial
。在建表的時候將主鍵聲明為此類型,然后將注解的自增類型修改為GenerationType.IDENTITY
,問題就解決了。
為什么說是“偽“類型呢?PostgreSQL的文檔說的很清楚。
建表時候,使用語句
CREATE TABLE tablename ( colname SERIAL );
其實就相當於
CREATE SEQUENCE tablename_colname_seq; CREATE TABLE tablename ( colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') ); ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
完全可以把serial
看作是PostgreSQL的語法糖。
------------------------------------