是否始终将 UUID 用于 JPA 实体的 id 属性并在其上使用等于和哈希码?

Posted

技术标签:

【中文标题】是否始终将 UUID 用于 JPA 实体的 id 属性并在其上使用等于和哈希码?【英文标题】:Always use a UUID for the id property of JPA entities and base equals and hashcode on it? 【发布时间】:2017-10-02 17:30:44 【问题描述】:

lot of articles 介绍了如何为 JPA 实体实现 hashcodeequals

与其为创建的每个 JPA 实体担心这个问题,不如将 finalupdatable = false id 属性设置为 UUID 并将 hashcodeequals 实现基于那个身份证?这样做有什么缺点吗?

【问题讨论】:

似乎一致认为这是基于this answer here的好主意。 【参考方案1】:

当您可以基于 AUTO_INCREMENTED 或基于 SEQUENCE 的主键实现 equalshashCode 时,为什么要添加新的额外列或使用与 mysql 聚集索引不兼容的 UUID?

所以,这就是您的实现的样子:

@Entity
public class Book implements Identifiable<Long> 
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String title;
 
    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (!(o instanceof Book)) return false;
        Book book = (Book) o;
        return getId() != null && Objects.equals(getId(), book.getId());
    
 
    @Override
    public int hashCode() 
        return getClass().hashCode();
    
 
    //Getters and setters omitted for brevity

常量getClass().hashCode() 值用于确保它在所有实体状态转换中保持一致。

【讨论】:

以上是关于是否始终将 UUID 用于 JPA 实体的 id 属性并在其上使用等于和哈希码?的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 在 PostgreSQL 中持久化 UUID

如何使用 UUID 字段而不是 JPA 的主键?

Spring data jpa使用枚举

使用 Spring JPA 在 H2 和 Sql Server 中持久化的 Java UUID

将 Java UUID 存储在二进制数据库列中,Hibernate/JPA 与原始 JDBC

用于视图的 JPA 实体包含连接和别名