gpt4 book ai didi

Hibernate 等于方法

转载 作者:行者123 更新时间:2023-12-02 01:31:29 25 4
gpt4 key购买 nike

有很多问题与如何实现由 Hibernate 管理的实体的良好 equals 和 hashcode 函数相关。但是,我没有找到解决我的问题的方法:

我有一个没有业务 key 的实体类。它有一个生成的主键、一些不能用于身份的属性以及与其他实体类的多个关联。我总是尝试坚持 Hibernate 的建议(业务键相等),所以我不想检查生成的 Id。这导致检查唯一标识我的实体类的 2 个关联。但这会导致这两个关联必须定义为 FetchType.EAGER。

我的 equals 函数还有其他替代方案吗?


更新:

您对 Hibernate 中“通用”equals 方法的以下解决方案有何看法?

public boolean equals(Object object) {
if (this == object) return true;
if (! (object instanceof AbstractEntity)) return false;

AbstractEntity other = (AbstractEntity) object;

if (getId() == null && other.getId() != null) return false;
if (getId() != null && other.getId() == null) return false;
if (getId() == null && other.getId() == null) return uuid == other.uuid;
return getId().longValue() == other.getId().longValue();
}

这样,实体就可以安全地在集合中使用。当实体分离时,通过ID进行比较。当实体是 transient 时,将通过生成的 UUID 进行比较。因此,我看到的唯一缺点是 transient 实体是通过 UUID 而不是业务 key 进行比较的。

非常欢迎任何建议!

最佳答案

Liferay 执行与以下解决方案类似的操作。我希望它有帮助。

此解决方案需要在表中添加一个附加列,并在实体中添加一个字段来保存唯一的“计数器”。这是使您的实体独一无二的计数器。

将会有一个新表,例如“ENTITY_COUNTER”表,其中有两列 - 1. 您的实体名称和 2. 给出的最高“可能”计数器。

您需要创建一个单例,它会在创建实体时将这些独特的计数器(认为是 token )分发给您的实体。每次实体获取 token 时,计数器都会增加 1。

你的单例不会每次都去数据库更新最高 token 。每当它发出 1000 个唯一 token 时,它就会更新数据库。单例将获得一批 1000 个 token 来分发,一旦用完这些 token ,它将用它持有的最高 token 数更新 ENTITY_COUNTER 表。

例如ENTITY_COUNTER 中的第一个更新将为 EntityName 1000,并且每创建 1000 个实体,该数字就会增加 1000。

这样,您就可以拥有一个在持久化之前可供您的实体使用的唯一标识符。

关于Hibernate 等于方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252070/

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