我正在尝试使用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'
结果是:
这意味着没有结果,但实际上应该有一个结果。使用jpa也没有返回任何结果。
findById
方法,该方法已由Spring Data提供,并且可能会干扰默认方法。此外,使用您正在使用的类型时,数据库列需要是char或varchar,而不是其他类型。 - M. Deinum