SpringBoot连接PostgreSQL
这个 org.postgresql.ateClob() ⽅法尚未被实作
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.p.use_jdbc_metadata_defaults = false
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
---------------------
---------------------------------------
⾸先,配置好POM,使⽤默认配置启动的时候会报⼀个错误。
java.sql.SQLFeatureNotSupportedException: Method org.postgresql.ateClob() is not yet implemented.
根据,这个是由于:Hibernate尝试验证PostgreSQL的CLOB特性,但是PostgreSQL的JDBC驱动并没有实现这个特性,所以抛出了异常。
解决⽅法是:关闭这个特性的检测。在配置⽂件⾥添加如下内容:
spring:
jpa:
# Disable feature detection by this undocumented parameter. Check the ine.jdbc.figure method for more details.
p.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是⼀种特殊的单⾏表,⽤于⽣成序列数字。
看这⾥:。
哎,本来⼀张表的事情,要⽤两张表来完成,好⿇烦~~~
springboot其实就是spring不过,PostgreSQL已经完善了这个问题,提供⼀种“伪“类型——serial。在建表的时候将主键声明为此类型,然后将注解的⾃增类型修改
为GenerationType.IDENTITY,问题就解决了。
为什么说是“伪“类型呢?说的很清楚。
建表时候,使⽤语句
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 lname;
完全可以把serial看作是PostgreSQL的语法糖。
------------------------------------
检索数据时出现relation ‘table_name‘’ does not exist的问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论