我知道这个话题已经被讨论了很多次,但仍然需要对我们正面临的问题作一些澄清。休眠最好practices谈论使用自然键的equals/hashCode方法。我们确实有一个组合键,它由2个参数组成(称为String name,Organization org),一个特定对象所属的参数。不幸的是,我不能使用org,因为它被延迟加载并导致其他问题,我也不想创建代理键(可能是从数据库自动生成的,或者是在创建对象之前通过API调用创建的UUID)。因为在上面的Object(name,org)字段中是独一无二的,我不能只根据name字段本身来写我的逻辑。代理键是唯一的选择,这是否意味着我必须将此值作为表中每行的一部分存储?使用自然键作为equals和hashCode的一部分
回答
Hibernate最佳实践讨论使用equals/hashCode方法的自然键。
是的,我不会详细说明这一点。
我们确实有一个组合键,它由2个参数组成(称为String name,Organization org),特定对象所属的组合键。不幸的是,我不能使用org,因为它被延迟加载并导致其他问题。
你能详细说明一下,也许用一些代码说明吗?我想了解你是如何准确地完成这项工作的,以及问题所在。
在上面的Object(name,org)字段中,我确实拥有什么样的选项是唯一的,我不能仅仅基于name字段本身来编写我的逻辑。
正如我所说,提供更多的细节可能会有所帮助。但为了以防万一,请注意,在代理上调用org.getId()
不应触发加载实体,只要您使用的是property access type,那么您应该能够在等式实现中使用它。
什么是对象有一个名称和组织?我会假设它叫做Foo。我认为你不能说foo.getOrganization(),因为数据库连接已关闭?你能否改变你的FooDAO,以便在从数据库读取foo时立即加载组织?
然后,当你需要用equals()和hashCode()做些什么的时候它就可以使用了。
如果你希望像
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;
}
我有没有更新的网页,休眠提供以下矩阵
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
使用:
要使用的对象作为复合-ID,它必须实现equals /的hashCode在某些情况下,在这种情况下,==身份是不够的。在集
多个新的实例:
请问以下工作与否:
HashSet someSet = new HashSet();
someSet.add(new PersistentClass());
someSet.add(new PersistentClass());
assert(someSet.size() == 2);
从另一个会话等于同一个对象:
请问以下工作或不:
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哪里等于/的hashCode实现大量用于指定属性讨论
恕我直言,问题在于hashCode的实现离子。我想知道OP如何用他懒惰的组织来实现(一致的)hashCode。 – 2010-09-25 12:34:00
- 1. Overrding equals和hashCode
- 2. Map HashCode和Equals
- 3. toString,hashcode和equals方法内部接口
- 4. Java equals()和hashCode()的变化
- 5. hashCode和Equals在Map键中无法正常工作
- 6. Google App Engine,JDO和equals/hashCode
- 7. 为什么Collection接口有equals()和hashCode()?
- 8. 在Idea的“Generate ...”中自定义equals/hashCode
- 9. 重写的hashCode()和equals()方法
- 10. 什么是重写equals()和hashCode()的POJO?
- 11. 应该如何equals和hashCode使用JPA时和Hibernate
- 12. 使用自动生成的hibenate实体对象的ID在equals和hashCode方法
- 13. 在字典中使用IEqualityComparer的效率vs HashCode和Equals()
- 14. 如何实现hashCode和equals方法
- 15. 忽略equals()和hashCode()在Java中
- 16. SCJP hashCode()和equals()方法混淆
- 17. 在Eclipse中调试equals()和hashCode()
- 18. hashCode()和equals()重写实际上是如何工作的?
- 19. crc32作为主键的自然键
- 20. getters可以在equals和hashcode中使用吗?
- 21. 如何让Hibernate Tools使用toString,equals和hashcode生成POJO?
- 22. netbeans能否为映射自动生成正确的hashCode()和equals()方法?
- 23. 如何重写equals(),hashCode()和的compareTo()对于一个HashSet
- 24. 使用@作为NSDictionary字符串中的键的一部分
- 25. contains()的Collection框架不使用hashcode,而是使用equals(),为什么?
- 26. 使用equalsIgnoreCase重写的equals重载的hashCode检查平等
- 27. 获取未被覆盖的equals方法使用hashCode
- 28. 作为快捷键的一部分的“Windows”键
- 29. Intellij插件生成getter/setter,hashcode/equals,toString
- 30. HashMap的不正确的equals和hashCode实现
最多访问策略,它允许用户获得关联实体的标识符而不会触及数据库 – 2010-09-25 02:33:43