Hibernate: 无法通过UUID进行查找

4

我正在尝试使用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的条目,也不会返回结果。

即使我直接在数据库上使用纯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());
    }
}

以下表格展示了结果:

输入图像描述

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

结果是:

enter image description here

这意味着没有结果,但实际上应该有一个结果。使用jpa也没有返回任何结果。


2
删除findById方法,该方法已由Spring Data提供,并且可能会干扰默认方法。此外,使用您正在使用的类型时,数据库列需要是char或varchar,而不是其他类型。 - M. Deinum
3个回答

4

它可以与以下内容兼容:

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

2

你尝试过使用这个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")

1
好的,使用char类型并更改生成器就可以了,我的解决方案已经接近完成了 :) 很高兴最终能够解决问题。 - dreyus95

1

在我的项目中,当我使用2.1.212版本的H2内存数据库时,我遇到了同样的问题。 我将H2版本从2.1.212转换为1.4.200,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接