Chs*_*y76 66
Hibernate有何时/如何重写一个很好的和长期的描述equals()/ hashCode()在文档
它的要点是,如果您的实体将成为其中的一部分Set或者您将要分离/附加其实例,您只需要担心它.后者并不常见.前者通常最好通过以下方式处理:
equals()/ hashCode()关于业务键 - 例如,在对象(或至少是会话)生命周期期间不会改变的属性的唯一组合.equals()/ hashCode()在主键上设置它和对象标识/ System.identityHashCode()否则.这里的重要部分是,您需要在添加新实体并保持后重新加载您的Set; 否则您最终可能会遇到奇怪的行为(最终导致错误和/或数据损坏),因为您的实体可能被分配到与其当前不匹配的存储桶hashCode().小智 34
我不认为接受的答案是准确的.
回答原来的问题:
对于大多数情况,默认实现是否足够好?
答案是肯定的,在大多数情况下都是如此.
你只需要重写equals()和hashcode()该实体将被用在Set(这是很常见的)和实体将被分离,并随后重新附着,休眠会话(这是休眠的一种罕见的使用).
接受的答案表明,如果任一条件为真,则需要覆盖这些方法.
sti*_*vlo 12
当通过延迟加载加载实体时,它不是基类型的实例,而是由javassist生成的动态生成的子类型,因此对同一类类型的检查将失败,因此不要使用:
if (getClass() != that.getClass()) return false;
Run Code Online (Sandbox Code Playgroud)
改为使用:
if (!(otherObject instanceof Unit)) return false;
Run Code Online (Sandbox Code Playgroud)
这也是一种很好的做法,正如Java Practices中实现equals所解释的那样.
出于同样的原因,直接访问字段,可能无法工作并返回null,而不是基础值,因此不要在属性上使用比较,而是使用getter,因为它们可能会触发加载基础值.
是的,这很难.在我的项目中,equals和hashCode都依赖于对象的id.这个解决方案的问题是,如果对象尚未持久化,它们都不起作用,因为id是由数据库生成的.在我的情况下,这是可以容忍的,因为在几乎所有情况下,对象都会立即存在.除此之外,它工作得很好并且易于实现.
| 归档时间: |
|
| 查看次数: |
51946 次 |
| 最近记录: |