首页 > 解决方案 > 休眠 UUID 与字符串行为 - 类似的 ID 加载为相同的实体,第二个实体被忽略/覆盖 - 冲突

问题描述

最近有同事String在我们班把ID类型从UUID改成了UUID,见下图:

原来的

public class EventEntry {
    
    private @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    //@Column(columnDefinition = "RAWUUID RAW(16)")
    String id;

修改的

public class EventEntry {
    
    @Id
//  @GeneratedValue(generator = "uuid2")
//    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    //@Column(columnDefinition = "RAWUUID RAW(16)")
    private UUID id;

我们现在看到行为发生了一些变化,特别是 2 个变化。

首先是数据库中的 ID 已从 eg 更改 a656944f-0b1f-4b0e-b3d6-cfc22c64e2822166942B104D4846A2EAFEE7BC4C8866

第二个更改涉及非常相似的 ID。我们进行了一些手动编辑/插入,并且有 2 个 ID 非常相似的事件:

bad5b19f-479c-4a99-a814-306e7289ea53对比 bad5b19f-479c-4a99-a814-306e7289ea54

我们的 JPA 查询现在将这两行加载为同一个实体,特别是带有bad5b19f-479c-4a99-a814-306e7289ea54. 似乎存在某种冲突 - 我怀疑这是因为手动插入的与原始的非常相似,并且没有遵循有效的 UUID 算法。

有人可以证实这一点并解释其背后的机制吗?为什么系统会默默地失败并且基本上将具有非常相似 UUID 的 2 行视为同一行......(它完全忽略了数据库中实际第二行中的信息)?

标签: springoraclehibernatejpauuid

解决方案


推荐阅读