hibernate研究

来源:互联网 发布:马前课指算法日加时 编辑:程序博客网 时间:2024/04/30 20:07
在关系型数据库中,主键可分为自然主键和代理主键.自然主键是含有业务意义的,代理主键则不含有业务意义.因此代理主键可以适应不断变化的业务需求,所以推荐使用.代理主键一般设置为整型,hibernate中可以把OID设为long、int 和short类型及它们的包装类型(Long、Integer、Short).关于代理主键的映射请参照这里,今天说说hibernate对自然主键的映射.  映射单个自然主键同映射代理主键基本相同,这里简单说明一下映射复合自然主键.复合主键的映射有两种方法.假如USERS表的主键为NAME字段和TEL字段,那么在User类中也应该存在相对应的属性和方法,映射方法如下:方法1程序代码 程序代码  以下代码生成一个User对象,并保存.程序代码 程序代码User user = new User();user.setName("hiswing");user.setTel(12345678);......session.save(user);  以下代码加载一个User对象.程序代码 程序代码User user = new User();user.setName("hiswing");user.setTel(12345678);session.load(User.class, user);  Session.load根据指定的条件从数据库中检索出记录后,会把数据拷贝到传入的参数user中.这里需要指出的是,User类必须实现java.io.Serializable接口,并覆写equals和hashcode方法.否则会弹出以下错误信息:程序代码 程序代码net.sf.hibernate.MappingException: composite-id class must override equals() and hashCode(): org.junesky.orm.Userat net.sf.hibernate.cfg.Binder.bindRootClass(Binder.java:303)at net.sf.hibernate.cfg.Binder.bindRoot(Binder.java:1229)at net.sf.hibernate.cfg.Configuration.add(Configuration.java:249)at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:285)at net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:333)at org.junesky.action.HibernateRun.main(HibernateRun.java:24)net.sf.hibernate.MappingException: Error reading resource: org/junesky/orm/User.hbm.xmlat net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:336)at org.junesky.action.HibernateRun.main(HibernateRun.java:24)Caused by: net.sf.hibernate.MappingException: composite-id class must override equals() and hashCode(): org.junesky.orm.Userat net.sf.hibernate.cfg.Binder.bindRootClass(Binder.java:303)at net.sf.hibernate.cfg.Binder.bindRoot(Binder.java:1229)at net.sf.hibernate.cfg.Configuration.add(Configuration.java:249)at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:285)at net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:333)... 1 moreException in thread "main"  我们必须实现java.io.Serializable接口并覆写equals和hashCode两个方法.改正User类,如下:程序代码 程序代码package org.junesky.orm;import java.io.Serializable;public class User implements Serializable {private String address;private String name;private Long tel;public boolean equals(Object o) {if (this == o)return true;return false;}public int hashCode() {int result;result = (name == null ? 0 : name.hashCode());result = 29 * result + (tel == null ? 0 : tel.hashCode());return result;}此处省略getter和setter方法……}  以下代码生成一个User对象,并保存.程序代码 程序代码User user = new User();user.setName("hiswing");user.setTel(12345678);......session.save(user);  以下代码加载一个User对象.程序代码 程序代码User user = new User();user.setName("hiswing");user.setTel(12345678);session.load(User.class, user);方法2  定义一个主键类,该类必须实现java.io.Serializable接口并覆写equals和hashcode方法.该类中定义了name和tel属性.程序代码 程序代码package org.junesky.orm;import java.io.Serializable;public class UserID implements Serializable {private String name;private Long tel;public boolean equals(Object o) {System.out.println(o);if (this == o)return true;if (!(o instanceof UserID))return false;UserID userId = (UserID) o;if (!this.name.equals(userId.getName()))return false;if (!this.tel.equals(userId.getTel()))return false;return true;}public int hashCode() {int result;result = (name == null ? 0 : name.hashCode());result = 29 * result + (tel == null ? 0 : tel.hashCode());return result;}此处省略getter和setter方法……}  在User类中,不必定义name和tel属性,而是定义UserID属性.Private UserID userID;  映射代码如下:程序代码 程序代码  以下代码生成一个User对象,并保存.程序代码 程序代码UserID userid = new UserID();userid.setTel(new Long(12345678));userid.setName("hiswing");User user = new User();user.setAddress("hangzho");user.setUserID(userid);......session.save(user);  以下代码加载一个User对象.程序代码 程序代码UserID userid = new UserID();userid.setTel(new Long(12345678));userid.setName("hiswing");User user = new User();user.setAddress("hangzho");user.setUserID(userid);User user2 = (User) session.load(User.class, userid);
原创粉丝点击