目前我正在尝试将应用程序迁移到 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;
据我所知,在插入数据期间必须应用扳手函数,但这不是出于任何原因。
也许有人有同样的问题或知道如何解决它?
我尝试调试 hibernate 以了解为什么该函数不包装字符串以 json 格式插入列,但我无法理解。 我期望以 json 格式存储 java 对象。
该问题是由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