本文共 2115 字,大约阅读时间需要 7 分钟。
对Java而言,要识别两个对象是否为同一个对象有两种方式:
1.内存地址识别(“= =”号识别); 2.根据equals()、hashCode()中的定义 (默认Object类中定义的equals(Object o)方法也是按内存地址来比较的),具体代码如下:public boolean equals(Object obj){ return (this==obj); }
在Hibernate中,如果是在同一个session中根据相同查询所得到的相同记录,则它们会拥有相同的Java识别,但当获取某一记录后关闭session,重新打开session再次获取同一记录时,相比较前后获取的两条记录,会被判断成不是相同的记录。
如果您要有必要比较通过查询后两个对象的内容是否相同,必须重写 equals()与hashCode()。
1.重写equals():
public boolean equals(Object obj) { if (this == obj) return true; if(obj == null) return false; if (!(obj instanceof User)) return false; User other=(User)obj; if(id!=other.id) { return false; } if(age!=other.age) { return false; } if(name != null && other.name != null) { if(!name.equals(other.name)) { return false; } } if(gender != null && other.gender != null) { if(!gender.equals(other.gender)) { return false; } } if(!birthday.equals(other.birthday)) { return false; } return true; }
2.重写hashCode():
public int hashCode() { int result; result = name.hashCode(); result = 29 * result + getBirthday().hashCode(); return result; }
3.对象识别:
public void testObjectIndentify() { SessionFactory sf = null; Session session = null; Transaction ts = null; User u1 = null, u2 = null; try { sf = HibernateUtil.getSessionFactory();//SessionFactory单态模式 session = sf.getCurrentSession(); //保证每个读写线程有唯一的session实例 ts = session.beginTransaction(); u1 = (User)session.get(User.class,1); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); if(ts != null) { ts.rollback(); } } try { sf = HibernateUtil.getSessionFactory();//SessionFactory单态模式 session = sf.getCurrentSession(); //保证每个读写线程有唯一的session实例 ts = session.beginTransaction(); u2 = (User)session.get(User.class,1); ts.commit(); } catch (HibernateException e) { // TODO Auto-generated catch block e.printStackTrace(); if(ts != null) { ts.rollback(); } } System.out.println(u1 == u2); System.out.println(u1.equals(u2)); }
转载地址:http://cauhj.baihongyu.com/