繁体   English   中英

是否在JPA实体上保留随机UUID作为对象ID?

[英]Persit random UUID serving as object ID on JPA entity?

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

到目前为止,我一直坚持基于字符串的对象ID。 这会在每个表中添加一个额外的列,但这不会打扰我。

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

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

如果我停止保留UUID,hashCode()和equals()方法将是什么样? 就像两层比较一样,如果主键不为null,则首先使用主键;如果主键为null,则使用对象id。

对实体而言, equalshashCode的正确实现确实是一个大问题。

如果您拥有“自然”主键(例如某人的社会保险号),则不必保留额外的业务键值。 它可以是单个值,也可以是值的组合-例如名称,姓氏,生日和地址的组合。 如果您具有这样的自然PK,请使用它。 如果您没有它,使用UUID是创建一个的好方法。

如果将UUID用作equalshashCode ,则还应保留它,因此同一记录的两个实例被视为相等。

您的equalshashCode应该基于此业务密钥,而不是基于数据库提供的ID。 如果使用数据库提供的ID,则将所有新实体视为相等。 这可能会导致意外的行为,尤其是在使用Collection时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM