因为hibernate要和数据库打交道,所以对于对象的标识,需以数据库的主键为标识(可以是与业务逻辑无关的自增主键,也可以是与业务逻辑有关的复合主键)当看到复合主键类的时候,我的第一反应就是需要重写主键类的hashcode和equals方法,来完成对象的标识,从而使得向
session中的map中添加和获取实体类对象变得更为高效。但是
------------------------------------------------------------------
当我把主键类的hashcode方法和equals方法注释掉以后,我发现hibernate 在get 实体类的时候,仍然工作的很好第一次获取实体类的时候,sql打印了出来
第二次获取实体类的时候,sql没打印出来,我猜想是session中map缓存的存在导致的(这点很重要,说明在数据库操作之间,先于当前session中缓存的map中找,如果找到,直接返回,如果找不到,再去数据库中提取)问题来了因为我已经注释掉了hashcode和equals方法,所以主键类的hashcode和equals方法都是object类原生的,那么,第二次获取实体类对象所用的主键类对象并不‘等于’第一次的主键类对象,所以第二次也应该打印sql语句,当恰恰没有打印
我现在的猜想是这样的:hibernate框架在维护session中map的时候,利用java放射,完成了一个类似于hashcode和equals的方法,该方法是以配置文件中 composite-id中的
属性作为参数,完成对象的键值对map
贴点代码:
//主键类
public class PrimaryKey implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private String userid;
private String product; public void setUserid(String userid) {
this.userid = userid;
} public String getUserid() {
return this.userid;
} public void setProduct(String product) {
this.product = product;
} public String getProduct() {
return this.product;
} /*
 * @Override public boolean equals(Object object) { /* if (this == object) {
 * return true; } if (object == null) { return false; } if (!(object
 * instanceof PrimaryKey)) { return false; } PrimaryKey temp = (PrimaryKey)
 * object; if (userid == null) { if (temp.userid != null) { return false; }
 * } else if (!userid.equals(temp.userid)) { return false; } if (product ==
 * null) { if (temp.product != null) { return false; } } else if
 * (!product.equals(temp.product)) { return false; } return true;
 */
// return false;
// }/*
/*
 * @Override public int hashCode() { /* final int prime = 31; int result =
 * 1; result = prime * result + ((userid == null) ? 0 : userid.hashCode());
 * result = prime * result + ((product == null) ? 0 : product.hashCode());
 * return result;
 */
// return super.hashCode();
// }
}
//实体类
public class User implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;
private String username;
private String password;
private String part;
private List<String> email;
private PrimaryKey primarykey;
private RightList right; public void setRight(RightList right) {
this.right = right;
} public RightList getRight() {
return right;
} public List<String> getEmail() {
return email; } public void setEmail(List<String> email) {
this.email = email;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public void setPrimarykey(PrimaryKey primarykey) {
this.primarykey = primarykey;
} public PrimaryKey getprimarykey() {
return this.primarykey;
} public String getPart() {
return part;
} public void setPart(String part) {
this.part = part;
} public int hashcode() {
  int result = 17; result = 31 * result +
  primarykey.getUserid().hashCode(); result = 31 * result +
  primarykey.getProduct().hashCode(); return result;
 
// return this.hashcode()%10;
//return this.hashcode();
} public boolean equals(Object o) {
  return (o instanceof User) && (primarykey.getUserid() == ((User)
  o).getprimarykey() .getUserid()) && (primarykey.getProduct() ==
  ((User) o).getprimarykey() .getProduct());
 
//return false;
}
}
//DAO 类
public class UserDAO {
public User getUser(String userid, String product)
throws HibernateException { /*
 * 创建复合主键类引用对象
 */
PrimaryKey primarykey = new PrimaryKey();
primarykey.setProduct(product);
primarykey.setUserid(userid);
/*
 * 实体对象
 */
User user = null;
Session session = null;
Transaction trans = null;
try {
session = HibernateSessionFactory.getSession();
trans = session.beginTransaction();
user = (User) session.get(User.class, (Serializable) primarykey);
trans.commit();
} catch (HibernateException e) {
throw e;
} finally {
if (session != null) {
// HibernateSessionFactory.closeSession();
}
}
return user; }}
//main
public static void main(String[] args) { UserDAO userdao = new UserDAO();
com.demo.hibernate.beans.User user = userdao.getUser("11529695", "k%");
String name = user.getUsername();
System.out.println(name); User usertest = userdao.getUser("11529695", "k%");
String nametest = usertest.getUsername();
System.out.println(nametest);
输出Hibernate: select user0_.userid as userid0_0_, user0_.product as product0_0_, user0_.right_gamma as right3_0_0_, user0_.right_alarm as right4_0_0_, user0_.right_pepsy as right5_0_0_, user0_.right_telas as right6_0_0_, user0_.right_opirus as right7_0_0_, user0_.right_st as right8_0_0_, user0_.right_tnis as right9_0_0_, user0_.right_piss as right10_0_0_, user0_.right_tadis as right11_0_0_, user0_.right_sedas as right12_0_0_, user0_.right_admin as right13_0_0_, user0_.name as name0_0_, user0_.passwd as passwd0_0_, user0_.part as part0_0_, user0_.e_mail as e17_0_0_ from user_info_nice user0_ where user0_.userid=? and user0_.product=?
abc
abc我的猜想输出是:
Hibernate: select user0_.userid as userid0_0_, user0_.product as product0_0_, user0_.right_gamma as right3_0_0_, user0_.right_alarm as right4_0_0_, user0_.right_pepsy as right5_0_0_, user0_.right_telas as right6_0_0_, user0_.right_opirus as right7_0_0_, user0_.right_st as right8_0_0_, user0_.right_tnis as right9_0_0_, user0_.right_piss as right10_0_0_, user0_.right_tadis as right11_0_0_, user0_.right_sedas as right12_0_0_, user0_.right_admin as right13_0_0_, user0_.name as name0_0_, user0_.passwd as passwd0_0_, user0_.part as part0_0_, user0_.e_mail as e17_0_0_ from user_info_nice user0_ where user0_.userid=? and user0_.product=?
abc
Hibernate: select user0_.userid as userid0_0_, user0_.product as product0_0_, user0_.right_gamma as right3_0_0_, user0_.right_alarm as right4_0_0_, user0_.right_pepsy as right5_0_0_, user0_.right_telas as right6_0_0_, user0_.right_opirus as right7_0_0_, user0_.right_st as right8_0_0_, user0_.right_tnis as right9_0_0_, user0_.right_piss as right10_0_0_, user0_.right_tadis as right11_0_0_, user0_.right_sedas as right12_0_0_, user0_.right_admin as right13_0_0_, user0_.name as name0_0_, user0_.passwd as passwd0_0_, user0_.part as part0_0_, user0_.e_mail as e17_0_0_ from user_info_nice user0_ where user0_.userid=? and user0_.product=?
abc代码逻辑很清晰,请耐心看完,帮我分析一下原因,感谢~