Hibernate 6 和 Cloud Spanner 集成

问题描述 投票:0回答:1

目前我正在尝试将应用程序迁移到 Spring Boot 3 和 Hibernate 6。 我遇到的问题是,当我插入列必须采用 json 格式的数据时,出现错误

could not execute statement [INVALID_ARGUMENT: com.google.api.gax.rpc.InvalidArgumentException: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: Value has type STRING which cannot be inserted into column Filter, which has type JSON [at 1:292]\n...ColumnN,ColumnN+1,ColumnN+2) values (@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,...\n                                                     ^] [insert into Table1 (Column1,Column2,Column3,Column4,Column5, ...) values (?,?,?,?,?,...)]

我在我的列中添加了注释 @JdbcTypeCode(SqlTypes.JSON) 并定义了

org.hibernate.dialect.SpannerDialect
,但它不起作用。

@Column(name = "Filter")
@JdbcTypeCode(SqlTypes.JSON)
Filter filter;

据我所知,在插入数据期间必须应用扳手函数,但这不是出于任何原因。

Screenshot of adding spanner functions in SpannerDialect

也许有人有同样的问题或知道如何解决它?

我尝试调试 hibernate 以了解为什么该函数不包装字符串以 json 格式插入列,但我无法理解。 我期望以 json 格式存储 java 对象。

spring-boot hibernate spring-data google-cloud-spanner hibernate-6.x
1个回答
0
投票

该问题是由Hibernate中默认的JSON类型定义引起的,它不包含在数据库中插入/更新数据时的JSON类型代码。相反,它尝试将值作为字符串发送。这发生在这里:https://github.com/hibernate/hibernate-orm/blob/a84ba5c8c98812c03fcd34a8611b3c9da4c9afce/hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/JsonJdbcType.java#L123

Spanner 方言应该覆盖此行为,以便在发送到 Spanner 时包含正确的类型代码。最新的 Hibernate 6.x 方言中遗漏了这一点,但将在此处修复:https://github.com/GoogleCloudPlatform/google-cloud-spanner-hibernate/pull/944

© www.soinside.com 2019 - 2024. All rights reserved.