我正在从Sping Boot 2升级到3,沿着从Hibernate 5升级到6.1。
我有一个包含UUID列的PostgreSQL表:
Table "public.combination"
Column | Type | Collation | Nullable | Default
----------------------------+-----------+-----------+----------+-------------------
id | uuid | | not null | gen_random_uuid()
kind | kind_type | | not null |
我有一个包含该列的JPA模型:
import java.util.UUID;
@Entity
@Table(name = "combination")
public class Combination
{
@Id
@Column(name = "id")
@NotNull
private UUID id;
public UUID getId()
{
return id;
}
...
表中一条记录:
argas=# select * from combination ;
id | kind
--------------------------------------+---------------
0f787085-9a45-4512-ae55-f6db24ab8178 | connectivity
(1 rows)
我使用CrudRepository
子类查询该表:
@Repository
public interface CombinationRepository extends CrudRepository<Combination, UUID>
{
Iterable<Combination> findAllByKind(@NotNull Kind kind);
}
在Sping Boot 2/Hibernate 5中,UUID正确返回为0f787085-9a45-4512-ae55-f6db24ab8178
(mostSigBits = 1114764626895389970
,leastSigBits = -5884525917016194696
)。
但是在升级到Sping Boot 3/Hibernate 6之后,UUID返回为30663738-3730-3835-2d39-6134352d3435
(mostSigBits = 3487535676028631093
,mostSigBits = 3487535676028631093
)-我真的不知道为什么或者该怎么办。
我使用完全相同的运行配置,只是切换Git分支并重建所有内容。
我已经尝试将hibernate.type.preferred_uuid_jdbc_type
设置为CHAR
或BINARY
,但返回的值是相同的。PostgreSQL驱动程序版本是42.5.4。
这是一个Hibernate bug吗?我还能做些什么来解决这个问题?
1条答案
按热度按时间m2xkgtsf1#
为了重现这种行为,我编写了以下测试:
它生成以下DDL:
我相信这和你的模式是一样的
然后插入一行,让Postgres生成UUID:
它最后Assertdb的字符串表示和Java的字符串表示是相同的(当然,我还在命令行上仔细检查了
psql
)。在我看来这里的一切都很完美。
我不知道你的情况怎么样了。
**更新:**我的观点是,它看起来不像Hibernate中的bug。当然,我不知道Spring在这一切中做了什么。