在 postgres spring-boot + eclipselink 中保存为 JSON 数据类型的替代解决方案

Posted

技术标签:

【中文标题】在 postgres spring-boot + eclipselink 中保存为 JSON 数据类型的替代解决方案【英文标题】:Alternate solution to save as JSON datatype in postgres spring-boot + eclipselink 【发布时间】:2017-03-20 09:50:00 【问题描述】:

我正在使用带有 spring-boot JPA 的 eclipselink 2.6 来实现 postgres 中的持久性。

我将对象列表作为 JSON 列保存在数据库中。根据此解决方案:eclipselink + @convert(json) + postgres + list property 我能够将数据保存在 postgres 中。

当该列为空时,我得到这个异常:

Caused by: org.postgresql.util.PSQLException: ERROR: column "sample_column" is of type json but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

我可以通过这个答案解决这个问题:

Writing to JSON column of Postgres database using Spring / JPA

Q1:除了设置此属性stringtype=unspecified int url spring.datasource.url=jdbc:postgresql://localhost:5432/dbnam‌​e?stringtype=unspeci‌​fied,还有其他解决方案吗? Q2:如果没有,我如何在spring-boot的application.prooerties中设置stringtype=unspecified而不是将其嵌入spring.datasource.url

【问题讨论】:

关于 Q2,您已经在 application.prooerties 中设置了 stringtype=unspecified 吗?您还在寻找什么? 你用的是什么spring-boot版本? spring-boot 1.4.1 【参考方案1】:

答案是肯定的,但是是特定于实现的。

例如,在 Tomcat 中,此属性称为connectionProperties,因此您可以这样写:

spring.datasource.tomcat.connection-properties: stringtype=unspecified

来自the Spring-Boot documentation。

也可以使用它们各自的前缀(spring.datasource.tomcat.、spring.datasource.hikari.、spring.datasource.dbcp.* 和 spring .datasource.dbcp2.*)。有关详细信息,请参阅您正在使用的连接池实现的文档。

【讨论】:

【参考方案2】:

如果您使用的是 spring-boot 1.4.1 或更高版本, 在资源文件夹中添加一个data.sql文件,-- IN H2 database, create a column as 'OTHER' data type, -- if H2 fails to create a column as 'JSON' data type. CREATE DOMAIN IF NOT EXISTS JSON AS OTHER;

此 .sql 文件将在您的应用程序启动期间执行,并将在表中为 H2 数据库中的 'json' 数据类型列创建数据类型为 others 的列.

【讨论】:

以上是关于在 postgres spring-boot + eclipselink 中保存为 JSON 数据类型的替代解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot JPA 连接到 postgres,其中在运行时提供数据库和模式

在 postgres spring-boot + eclipselink 中保存为 JSON 数据类型的替代解决方案

docker-compose:spring-boot web 服务访问 postgres db 服务

连接被拒绝 postgres docker

spring-boot:数据库中断后jdbc重新连接

Spring-Boot 不适用于 Flyway