我喜欢对我所有的JPA域实体使用BaseDomain类。在基类中,我有一个对象ID(存储为字符串),是从UUID.random()生成的。对象ID是在创建对象时分配的。实体类还有一个主键,在持久化时由数据库分配。
到目前为止,我一直坚持基于字符串的对象ID。这会在每个表中添加一个额外的列,但这不会打扰我。
我想知道-是否有任何理由要保留对象ID(生成的UUID)?还是应该将随机UUID留在Java空间中?
我总是将域类hashCode()和equals()方法基于UUID而不是主键。这很好,因为在JVM和数据库中,UUID对于给定实体在整个生命周期中都保持不变。
如果我停止保留UUID,hashCode()和equals()方法将是什么样?就像两层比较一样,如果主键不为null,则首先使用主键,如果主键为null,则使用对象id。
正确实施equals
和hashCode
对于实体而言确实是一个大问题。
如果您拥有“自然”主键(例如某人的社会保险号),则不必保留额外的业务键值。它可以是单个值或值的组合-例如名称,姓氏,生日和地址的组合。如果您具有这样的自然PK,请使用它。如果您没有它,使用UUID是创建一个的好方法。
如果将UUID用于equals
和hashCode
,则还应将其持久化,因此同一记录的两个实例被认为是相等的。
您的equals
和hashCode
应该基于此业务密钥,而不是数据库提供的ID。如果使用数据库提供的ID,则将所有新实体视为相等。这可能会导致意外的行为,尤其是在使用Collections时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句