`

hibernate 中的equals()和hashCode()方法

阅读更多

HashSet判断加入的对象是否重复的原理:

对于Set接口的实现类HashSet,它是按照哈希算法来存取集合中的对象,并且因为其继承了Set接口,所以不允许插入相同的数据。那么它如何来保证不插入相同的数据,这就要使用到equals()hashCode()方法了。在我们往HashSet里面添加对象(add()方法里的参数都是对象)的时候,在Add()的方法内部,它首先调用该对象的hashCode()方法(hashCode方法用来计算该对象的哈希码),如果返回的哈希码与集合已存在对象的哈希码不一致,则add()方法认定该对象没有与集合中的其它对象重复,那么该对象将被添加进集合中。如果hashCode()方法返回的哈希码与集合已存在对象的哈希码一致,那么将调用该对象的equals方法,进一步判断两个对象是否相等。之所以在进行了hashcode(哈希码)的比较后,又调用equals()方法进行比较,是因为虽然HashSet采用的是通过hashcode来区分对象,但是在javahashcode会重码(即不同的对象,其hashcode可能会相同

在hibernate中,为什么要实体类重写这两个方法?

a.一般实体类是多的一方

b.判断这样的两个对象是相等的,不让它们重复加入

 

如:有一个类

 

public class Comment  {
 /**
  * @param args
  */
 private Long id ;   
    private String name ; //comment 人的名字   
    private Date createDate ;   
    private String content;   
    
 public Comment(String name,Date createDate,String content) {
  
  this.name=name;
  this.createDate =createDate;
  this.content = content;
 }
 根据需求,不允许这样的对象添加到hashset中,只允许一个

Comment d1 = new Comment("wind",date,"abbb");   
Comment d2 = new Comment("wind",date,"abbb");

Comment d3 = new Comment("wind",date,"ab");

 

 在类中重写方法就行了,如下

public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		if (this == obj)
		{
			return true;
		}					
		if (!(obj instanceof Comment)) {
			return false;
		}
			
		 Comment other = (Comment) obj;
		 if (getName()!=null && getName() .equals(other.getName())&& getCreateDate()!=null && getCreateDate().equals(other.getCreateDate())) {
			 return true;
		 } else {
			 return false;
		 }

 

 

public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + ((getName() == null) ? 0 : getName().hashCode());
		result = PRIME * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
		return result;
	}

 选择那个属性进行比较,要看你的系统的业务需求,一定要从业务需求里找比较属性

 为什么要选择name 和 createDate 这两个属性,在这里我们假设有这样一个业务,有一个人在某个时间写了评论,评论是Comment类,name 是这个人的名字,写作时间是createDate ,这两个的组合一定是唯一的,一个人不可能在同一个时间写下两篇文章,我们就选这样的组合做为比较,这样才符合业务的需求。

测试代码:

Set s = new HashSet();
        Date date = RefleshActionHelper.FormatDate("2004-05-09", "yyyy-mm-dd");
        Comment d1 = new Comment("wind",date,"abbb");   
        Comment d2 = new Comment("wind",date,"abbb");
        s.add(d1);     
        s.add(d2);         	
    	System.out.println(d1.hashCode()+"  "+d2.hashCode());
    	Iterator it =s.iterator();   	
    	while (it.hasNext()){
    		Comment	t= (Comment)it.next();
    		System.out.println(t.getName());
    	}

   结果是只添加了一个

上面比较的都是对象,如果比较基本类型呢,如,一个int count;我们在hashCode() 里这样写,基本类型是不能获得hashCode()方法的,直接加它的属性值就行了

public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + count
result = PRIME * result + ((getCreateDate() == null) ? 0 : getCreateDate().hashCode());
		return result;
	}

 

分享到:
评论

相关推荐

    commons-lang-2.3.jar

    一个实现Hibernate复合主键方法的equals,hashCode方法的类包

    Hibernate中文API大全

    它必须重新实现equals()和hashCode()方法, 始终和组合关键字在数据库中的概念保持一致 注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合...

    Hibernate注解映射联合主键

    第三、将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并要重写equals和hashcode.最后在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id,并在该类上方将上这样的注解:@Id...

    hibernate复合主键映射

    复合主键映射 <br>通常将复合主键相关属性,单独抽取出来,建立一个独立的类 * 必须实现序列化接口 * 必须实现equals和hashcode方法 采用标签进行映射,其它属性采用正常映射

    hibernate-types:Hibernate Types库为您提供了Hibernate ORM核心不支持的其他类型

    将JSON列类型映射到List或Map<String> ,需要确保POJO类型覆盖默认的equals和hashCode方法,并根据JSON对象的内容实现它们。 否则,Hibernate脏检查机制可能会触发意外的UPDATE语句。 查看。 Oracle 您应该使用...

    Hibernate+中文文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate中文详细学习文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    hibernate3.2中文文档(chm格式)

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate 中文 html 帮助文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. ...

    HibernateAPI中文版.chm

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    最全Hibernate 参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    hibernate 教程

    实现equals()和hashCode() 4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks) 4.5. 合法性检查(Validatable)回调 4.6. XDoclet标记示例 5. O/R Mapping基础 5.1. 映射声明(Mapping ...

    hibernate3.04中文文档.chm

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. ...

    Hibernate教程

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

    hibernate 体系结构与配置 参考文档(html)

    实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate3+中文参考文档

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. ...

    Hibernate注释大全收藏

    整个层次结构中的所有父类和子类属性都映射到同一个表中,他们的实例通过一个辨别符列(discriminator)来区分。 Plane 是父类。@DiscriminatorColumn 注解定义了辨别符列。对于继承层次结构中的每个类, @...

    涵盖了90%以上的面试题

    "=="和equals方法究竟有什么区别 String,StringBuffer,StringBuilder有什么区别 java中的数组是不是对象 数组初始化的方式有哪几种 length属性和length()方法有什么区别 finally块中的代码什么时候被执行 Java中的...

    Hibernate3的帮助文档

    5.3. 实现equals()和hashCode() 5.4. 动态模型(Dynamic models) 6. 对象/关系数据库映射基础(Basic O/R Mapping) 6.1. 映射定义(Mapping declaration) 6.1.1. Doctype 6.1.2. hibernate-mapping 6.1.3. class...

Global site tag (gtag.js) - Google Analytics