gpt4 book ai didi

java - 保留随机 UUID 作为 JPA 实体上的对象 ID?

转载 作者:太空宇宙 更新时间:2023-11-04 07:04:22 25 4
gpt4 key购买 nike

我喜欢对所有 JPA 域实体使用 BaseDomain 类。在基类中,我有一个对象 ID,存储为字符串,由 UUID.random() 生成。对象 ID 在对象创建时分配。实体类还有一个主键,在持久化时由数据库分配。

到目前为止,我一直保留基于字符串的对象 ID。这会为每个表添加一个附加列,但这并不困扰我。

我想知道 - 是否有任何理由保留对象 id(生成的 UUID)?或者随机 UUID 应该保留在 Java 空间中吗?

我的域类 hashCode() 和 equals() 方法始终基于 UUID,而不是主键。这很好,因为给定实体的 UUID 在其整个生命周期中保持不变,无论是在 JVM 中还是在数据库中。

如果我停止保留 UUID,hashCode() 和 equals() 方法会是什么样子?是否类似于两层比较,如果主键不为空,则首先使用主键,如果主键为空,则使用对象 id?

最佳答案

equalshashCode 的正确实现对于实体来说确实是一个很大的问题。

如果您有“自然”主键(例如某人的社会安全号码),则无需保留额外的业务键值。它可以是单个值或值的组合 - 例如姓名、出生日期和地址的组合。如果你有这样的天生PK,请使用它。如果您没有,使用 UUID 是创建 UUID 的好方法。

如果您将 UUID 用于 equalshashCode,您还应该保留它,因此同一记录的两个实例被认为是相等的。

您的 equalshashCode 应基于此业务 key ,而不是基于数据库提供的 ID。如果使用数据库提供的 ID,则所有新实体都被视为相同。这可能会导致意外的行为,尤其是在使用集合时。

关于java - 保留随机 UUID 作为 JPA 实体上的对象 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com