Hibernate中为什么要重写equals方法和hashcode方法
1、*为什么要重写equals方法,首先我们来看一下equals源码:
 public boolean equals(Object anObject) {
     if (this == anObject) {
         return true;
     }
     if (anObject instanceof String) {
         String anotherString = (String)anObject;
         int n = count;
         if (n == anotherString.count) {
         char v1[] = value;
         char v2[] = anotherString.value;
         int i = offset;
         int j = anotherString.offset;
         while (n-- != 0) {
             if (v1[i++] != v2[j++])
             return false;
         }
         return true;
         }
     }
     return false;
     }
*可以看出首先判定的是两个类的地址是否一致,如果是同一个类则地址相同,则符合;
*其次如果比较的两个类是String类则比较他们每个字符是否一致,如果一致则符合;
*可以看出,原来的equals方法并没有给出其他类比较的具体依据,如果两个Person类如果id一直我们则认为相同,
所以持久化时,hibernate会调用equals方法判断两个实体是否相同,即:数据库中两行是否一样,我们必须给出判定方法,原来的equals是不够用的
2、*为什么要重写Hashcode方法,我们任然来看一段代码:
 import java.util.HashSet;
 public class Test {
     String name;
     public Test(String name) {
         this.name = name;
     }
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         HashSet<Test> hs=new HashSet<Test>();
         Test t1=new Test("abc");
         Test t2=new Test("abc");
         System.out.println(t1.equals(t2));
         hs.add(t1);
         hs.add(t2);
         System.out.println(hs.size());
     }
     @Override
     public boolean equals(Object obj) {
         // TODO Auto-generated method stub
         if (this == obj)
             return true;
         else if (obj instanceof Test) {
             String name = ((Test) obj).name;
             if (this.name.equals(name))
                 return true;
             else
                 return false;
         } else
             return false;
     }
 }
*上面代码运行结果为:
true
2
我们发现当我们重写equals后,破坏了一些Java规则:如果两个对象相等,则不能放到HashSet集合中,但上面的结果恰恰相反,两个对象相等,却任然能放到HashSet中
*由此我们可以看出,放入HashSet集合时,并没有调用equals方法,那HashSet判断两个对象相等调用的是什么方法呢?很显然调用了HashCode方法,当我们重写Hashcode方法后,就会满足上述规则,所以重写equals方法后必须重写hashcode方法;
3、总结:equals和hashcode方法是重两个不同角度判断对象相等的,但前提是他们的效果必须一致:即有一个判断相等,则另一个必须判断为相等;
Hibernate中为什么要重写equals方法和hashcode方法的更多相关文章
- HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法
		
import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...
 - HashSet中的元素必须重写equals方法和hashCode方法
		
http://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html 1.为什么必须重写这两个方法. 2.什么事hashSet去重,符合什么样的 ...
 - 对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法
		
对象作为 map 的 key 时,需要重写 hashCode 和 equals方法 如果没有重写 hashCode 方法,那么下面的代码示例会输出 null 我们首先定义一个对象:BmapPoint, ...
 - JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法
		
在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...
 - Java重写equals方法和hashCode方法
		
package com.ddy; public class User { private Integer id; private String name; private St ...
 - 关于Object类的equals方法和hashCode方法
		
关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...
 - Java 如何重写对象的 equals 方法和 hashCode 方法
		
前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...
 - 详解equals()方法和hashCode()方法
		
前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...
 - Java基础系列-equals方法和hashCode方法
		
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
 
随机推荐
- aix puppet agent
			
demo控制脚本tel,150 5519 8367 Running Puppet on AIX Puppet on AIX is… not officially supported, yet stil ...
 - android 的线程模型和AsyncTask
			
android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...
 - 赵雅智_BroadcastReceiver电话监听
			
AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...
 - 利用VS自带的命令行工具查看和生产PublicKeyToken (转)
			
使用VS2013(或其他版本)命令行工具,键入:SN -T C:\*****.dll 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有强命 名,则不会有PublicKeyT ...
 - Response.Redirec方法传递汉字出现乱码
			
解决方法: //传参数时Response.Redirect("a.aspx?name"+Server.UrlEncode("我的名字")); //接收参数时 S ...
 - [转]取代cookie的网站追踪技术:”帆布指纹识别”初探
			
[前言] 一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动.C ...
 - 应用程序无法启动,因为应用程序的并行配置不正确,有关详细信息,请参阅应用程序事件日志,或使用命令行SxsTrace.exe工具
			
今天做项目,需要用C#引用C++的链接库文件,但是在调试的时候会报错这个错误. 运行SxsTrace.exe 以管理员用户登陆,启动cmd; 执行命令:SxsTrace Trace -logfile: ...
 - [C++空间分配]new运算符、operator new、placement new的区别于联系
			
先科普一下: 1. new的执行过程: (1)通过operator new申请内存 (2)使用placement new调用构造函数(内置类型忽略此步) (3)返回内存指针 2. new和malloc ...
 - HTTP POST和GET的区别[转]
			
http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.aspx 1.HTTP 只有POST和GET 两种命令模式: 2.POST是被设 ...
 - Docker容器的跨主机连接
			
Docker容器的跨主机连接 Docker容器的跨主机连接 使用网桥实现跨主机容器连接 网络拓扑 网络连接使用的是Bridge 操作 修改/etc/network/interfaces文件,分配静态I ...