[size=large][color=red]总[/color][/size]的来讲在hibernate中,判断数据库同一张表中2条记录是否相等时,只要在设置好主键后依据主键值是否相等就好,但由于一条记录就是一个持久化对象引用,所以就涉及到比较对象相等的问题.那么怎么比较呢?
在hibernate中判断2个持久化对象是否相等,比较复杂,需要考虑:
[list]
[*]在相同Session对象中查询相同标示符的属性值的持久化对象.
[*]在不同Session对象中查询相同的标示符属性值的持久化对象.
[/list]
前者,很简单,在同一个对象中,拥有相同的引用,代表同一条数据,他们是相等的.看代码:
[code]
Session session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb1 = tx.load(Guestbook.class,new Integer(1));
gb2 = tx.load(Guestbook.class,new Integer(2));
tx.commit()
System.out.println(gb1 == gb2);
//--返回--true--//
[/code]
后者,就复杂些,由于不在同一对象中所以不可以是用"=="来比比较.只有通过equals方法,按照java的定义,重写equals方法就必须相应的重写hashcode方法,看代码:
[code]
Session session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb1 = tx.load(Guestbook.class,new Integer(1));
tx.commit();
//---来自不同的Session-----//
session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb2 = tx.load(Guestbook.class,new Integer(1));
tx.commit();
//--重写--//
//在对应的持久化对象中,我用的是POJO,我是菜鸟,不会Annotation,
private void setId(Integer id){
this.id =id;
}
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + ((id == null)?0:id.hashCode());
return result;
}
public boolean equals(){
if(this == obj){return true;}
if(obj == null){return false;}
if(getClass() != (Guestbook)obj){return false;}
Guestbook other = (Guestbook)obj;
if(id == null){
if(other.id!=null){return false;}
else if(!id.equals(other.id)){return false;}
}
return true;
}
[/code]
在hibernate中判断2个持久化对象是否相等,比较复杂,需要考虑:
[list]
[*]在相同Session对象中查询相同标示符的属性值的持久化对象.
[*]在不同Session对象中查询相同的标示符属性值的持久化对象.
[/list]
前者,很简单,在同一个对象中,拥有相同的引用,代表同一条数据,他们是相等的.看代码:
[code]
Session session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb1 = tx.load(Guestbook.class,new Integer(1));
gb2 = tx.load(Guestbook.class,new Integer(2));
tx.commit()
System.out.println(gb1 == gb2);
//--返回--true--//
[/code]
后者,就复杂些,由于不在同一对象中所以不可以是用"=="来比比较.只有通过equals方法,按照java的定义,重写equals方法就必须相应的重写hashcode方法,看代码:
[code]
Session session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb1 = tx.load(Guestbook.class,new Integer(1));
tx.commit();
//---来自不同的Session-----//
session = SessionFactoryUtil.getSessionFactory();
Transaction tx = session.beginTransaction();
gb2 = tx.load(Guestbook.class,new Integer(1));
tx.commit();
//--重写--//
//在对应的持久化对象中,我用的是POJO,我是菜鸟,不会Annotation,
private void setId(Integer id){
this.id =id;
}
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + ((id == null)?0:id.hashCode());
return result;
}
public boolean equals(){
if(this == obj){return true;}
if(obj == null){return false;}
if(getClass() != (Guestbook)obj){return false;}
Guestbook other = (Guestbook)obj;
if(id == null){
if(other.id!=null){return false;}
else if(!id.equals(other.id)){return false;}
}
return true;
}
[/code]