gpt4 book ai didi

java - 使用自然键作为 equals 和 hashCode 的一部分

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:56:55 26 4
gpt4 key购买 nike

我知道这个话题已经被讨论了无数次,但仍然需要对我们面临的问题进行一些澄清。 hibernate 最佳practices谈论对 equals/hashCode 方法使用自然键。我们确实有一个复合键,它由特定对象所属的 2 个参数(比如字符串名称、组织组织)组成。不幸的是,我不能使用 org,因为它是延迟加载并导致其他问题,而且我也不想创建代理键(可能是从数据库自动生成的,或者是在创建对象之前通过 API 调用创建的 UUID)。我真正有什么样的选择,因为在上面的 Object (name, org) 字段中是唯一的,我不能仅仅根据名称字段本身来编写我的逻辑。代理键是唯一的选择吗,这是否意味着我必须将此值存储为表中每一行的一部分?

最佳答案

如果你想要类似的东西

public class MyEntity {

private String name;

private Organization organization;

// getter's and setter's

public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;

MyEntity other = (MyEntity) o;
return new EqualsBuilder().append(getName(), other.getName())
.append(getOrganization(), other.getOrganization())
.isEquals();
}

}

但是如果你想避免它因为你现在想要加载一个延迟加载的实体,你可以依赖Hibernate.isInitialized方法并提供您的自定义例程

public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;

MyEntity other = (MyEntity) o;
boolean equals = new EqualsBuilder().append(getName(), other.getName())
.isEquals();

if(Hibernate.isInitialized(getOrganization())) {
// loaded Organization
} else {
// supply custom routine
}

return equals;
}

我有一个未更新的网页,其中 Hibernate 提供以下矩阵

                                        no eq/hC at all  eq/hC with the id property  eq/hC with buisness key
use in a composite-id No Yes Yes
multiple new instances in set Yes No Yes
equal to same object from other session No Yes Yes
collections intact after saving Yes No Yes

哪里各种问题如下:

在复合 id 中使用:

To use an object as a composite-id, it has to implement equals/hashCode in some way, == identity will not be enough in this case.

集合中的多个新实例:

以下是否有效:

HashSet someSet = new HashSet();
someSet.add(new PersistentClass());
someSet.add(new PersistentClass());
assert(someSet.size() == 2);

等于来自另一个 session 的相同对象:

以下是否有效:

PersistentClass p1 = sessionOne.load(PersistentClass.class, new Integer(1));
PersistentClass p2 = sessionTwo.load(PersistentClass.class, new Integer(1));
assert(p1.equals(p2));

保存后完整的集合:

以下是否有效:

HashSet set = new HashSet();
User u = new User();
set.add(u);
session.save(u);
assert(set.contains(u));

它还突出显示了这个 Thread大量讨论 equals/hashCode 实现的地方

关于java - 使用自然键作为 equals 和 hashCode 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3789866/

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