休眠:无法通过 UUID 找到

Hibernate: Cannot find by UUID

我正在尝试使用 UUID 作为我的数据库的 ID,但我就是无法正常工作。

第一次尝试是:

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")
private UUID id;

但这会生成一些丑陋的字节代码。所以我加了一个类型注解:

@Id
@GeneratedValue(generator = "hibernate-uuid")
@GenericGenerator(name = "uuid", strategy = "uuid4")
@Type(type="org.hibernate.type.UUIDCharType")
private UUID id;

有了这个,我在我的 mysql 数据库中得到了一个字符表示,但是使用我的存储库查询数据库:

public interface CommentsRepository extends CrudRepository<Comment, UUID> {

    Comment findById(final UUID imageId);
}

不会找到任何结果 - 即使存在具有给定 UUID 的条目,它也不会 return 结果。 即使我直接在我的数据库上使用纯 SQL,它也不会找到任何结果。

我还需要做些什么来让 UUID 正常工作吗?

编辑

试试这个:

@Data
@Entity
public class Comment implements Serializable {

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Type(type = "uuid-char")
    private UUID id;
}

并添加一些默认值:

@Component
@Slf4j
public class CommentsSampleData implements CommandLineRunner {

    private final CommentsRepository repository;

    @Autowired
    public CommentsSampleData(final CommentsRepository repository) {
        this.repository = repository;
    }

    @Override
    public void run(String... args) {
        repository.save(new Comment());
        repository.save(new Comment());
        repository.save(new Comment());
        repository.save(new Comment());
    }
}

结果如下table:

表演:

SELECT * FROM comment WHERE id = 'b076a9f7-7e9e-4f5a-91f8-e66c7d076fac' 

结果:

这意味着没有结果,但应该有一个。使用 jpa 也不会 return 任何东西。

你有没有试过这个uuid注解也许:

@Id
GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
@Column(columnDefinition = "BINARY(16)")
private UUID id;

此示例应适用于 java.util.UUID

编辑:我读到您可能 运行 遇到二进制类型集的问题,因此您也可以尝试将其显式设置为 char uuid:

@Type(type="uuid-char")

适用于以下项目:

@Id
@GeneratedValue(generator = "uuid4")
@GenericGenerator(name = "UUID", strategy = "uuid4")
@Type(type = "org.hibernate.type.UUIDCharType")
@Column(columnDefinition = "CHAR(36)")
private UUID id;