第一天 ********************************************************** 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 第一步 写po类 package hibernate; //biz public class Account { private Long oid; private String actNo; private double bal; public Account() { } public Account(String actNo, double bal) { super(); this.actNo = actNo; this.bal = bal; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } } 第二步 注意2个XML文件的位置 Account.hbm.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="Account" table="t_act"> <id name="oid" column="OID"> <generator class="hilo">//算法的类名 <param name="table">t_hilo</param> <param name="column">HI</param> </generator> </id> <property name="actNo" column="ACTNO"/> <property name="bal" column="BALANCE"/> </class> </hibernate-mapping> hibernate.cfg.xml <?xml version="1.0"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@192.168.7.88:1521:tarena</property> <property name="connection.username">rensx</property> <property name="connection.password">rensx</property> <property name="connection.isolation">2</property> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <property name="myeclipse.connection.profile">rensx_oracle</property> <mapping resource="hibernate/Account.hbm.xml" /> </session-factory> </hibernate-configuration> 第三步 create table t_act( OID number(12) primary key, ACTNO varchar(30) not null unique, BALANCE number(12,2) not null); drop table t_hilo; create table t_hilo( HI number(12) primary key); insert into t_hilo values(1); commit; 第四步 import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class Test { public static void main(String[] args) { Configuration cfg = new Configuration().configure();//创建Configuration,初始化实例的所有变量,加载hibernate.cfg.xml至该实例 //通过hibernate.cfg.xml中的mapping节点配置并加载.hbm.xml文件 SessionFactory sf = cfg.buildSessionFactory();//创建SessionFactory实例 Account act = new Account("act_001", 2000.0); Session s = sf.openSession();//创建连接 // 非捕捉异常discriminator-value try { s.beginTransaction();//session创建事务实例 s.save(act);//对数据库的访问操作 s.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); sf.close(); } } } ************************************************************************************** 第二天 SessionFactory:重量级别的 线程安全的 开销比较大 Session:轻量级的 线程不安全 工具类 public class HibernateUtil { private static SessionFactory sf; public static SessionFactory getSessionFactory() { if (sf == null || sf.isClosed()) { try { sf = new Configuration().configure().buildSessionFactory(); } catch (HibernateException e) { e.printStackTrace(); } } return sf; } public static void release() { if(sf!=null&&!sf.isClosed()){ sf.close(); } } } public class Test2 { public static void main(String[] args) { Session s = null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); String hql = "from TestRen a where a.name=?";// 这是类 不是表 // 当具有唯一性 返回一个对象时 不用list集合了 // List l=s.createQuery(hql).setString(0, "ren").list(); Query q = s.createQuery(hql); q.setString(0, "ren");// 参数从0开始 List l = q.list(); StringBuffer sb = new StringBuffer(); for (TestRen a : (List<TestRen>) l) { sb.append(a.getOid() + " " + a.getName() + "\n"); } System.out.println(sb.toString()); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } public class Test3 { public static void main(String[] args) { Session s = null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); // String hql="from TestRen a where a.name=?";//这是类 不是表 String hql = "from TestRen a where a.name=:canshu";// 可以不用占位符号 使用参数 // 当具有唯一性 返回一个对象时 不用list集合了 TestRen a = (TestRen) s.createQuery(hql).setString("canshu", "ren") .uniqueResult(); StringBuffer sb = new StringBuffer(); sb.append(a.getOid() + " " + a.getName() + "\n"); System.out.println(sb.toString()); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } public class Test4-1{ public static void main(String[] args) { Session s = null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); //List params =new Arra String hql = "from TestRen a where a.name like ?"; Query q = s.createQuery(hql); q.setString(0, "ren%");// 参数从0开始 List l = q.list(); StringBuffer sb = new StringBuffer(); for (TestRen a : (List<TestRen>) l) { sb.append(a.getOid() + " " + a.getName() + "\n"); } System.out.println(sb.toString()); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } public class Test4-2{ public static void main(String[] args) { Session s = null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); List params =new ArrayList(); params.add("ren"); params.add("ren2"); params.add("ren3"); String hql = "from TestRen a where a.name in(:can)"; Query q = s.createQuery(hql); q.setParameterList("can", params);//最好这样用 List l = q.list(); StringBuffer sb = new StringBuffer(); for (TestRen a : (List<TestRen>) l) { sb.append(a.getOid() + " " + a.getName() + "\n"); } System.out.println(sb.toString()); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } 对象状态:暂态 持久态 游离态的转换图 hibernate 实现电子银行 package com.tarena.ebank.biz; public class Account { private Long oid; private String actNo; private double bal; public void deposite(double amount){ bal = bal + amount; } public void withdraw(double amount){ bal = bal - amount; } public Account(String actNo, double bal) { super(); this.actNo = actNo; this.bal = bal; } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public Account() { super(); } } package com.tarena.ebank.biz; public interface IAccountService { /*增加账户,删除账户,查询余额,存款,取款,转帐*/ public void createAccount(Account act); public void removeAccount(String actNo); public double getBal(String actNo); public void deposite(String actNo,double amount); public void withdraw(String actNo,double amount); public void transfer(String from ,String to, double amount); } public class AccountServiceHbnImpl implements IAccountService { private IAccountDAO dao = AccountDAOFactory.getDAO("hbn"); @Override public void createAccount(Account act) { Session s = null; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); dao.insert(act, s); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } } @Override public void deposite(String actNo, double amount) { Session s = null; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); Account a = dao.findAccountByActNo(actNo, s); a.deposite(amount); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } } @Override public double getBal(String actNo) { Session s = null; double bal = 0.0; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); Account a = dao.findAccountByActNo(actNo, s); bal = a.getBal(); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } return bal; } @Override public void removeAccount(String actNo) { Session s = null; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); dao.del(actNo, s); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } } @Override public void transfer(String from, String to, double amount) { Session s = null; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); dao.findAccountByActNo(from, s) .withdraw(amount); dao.findAccountByActNo(to, s) .deposite(amount); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } } @Override public void withdraw(String actNo, double amount) { Session s = null; try { s = HbnUtil.getSessionFactory().openSession(); s.beginTransaction(); Account a = dao.findAccountByActNo(actNo, s); a.withdraw(amount); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); }finally{ s.close(); } } } package com.tarena.ebank.biz; public class AccountServiceFactory { public static IAccountService getService(String type){ IAccountService s = null; if("hbn".equalsIgnoreCase(type)){ s = new AccountServiceHbnImpl(); }else if("jdbc".equalsIgnoreCase(type)){ s = new AccountServiceJdbcImpl(); } return s; } } <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.tarena.ebank.biz"> <class name="Account" table="t_ebank_act"> <id name="oid" column="OID" > <generator class="seqhilo"></generator> </id> <property name="actNo" column="ACTNO" unique="true" not-null="true"></property> <property name="bal" column="BALANCE" not-null="true" /> </class> </hibernate-mapping> public interface IAccountDAO { public void insert(Account act,Session s) throws DataException; public void del(String actNo,Session s) throws DataException; public void update(Account act, Session s) throws DataException; public Account findAccountByActNo(String actNo,Session s) throws DataException; } public class AccountDAOHbnImpl implements IAccountDAO { @Override public void del(String actNo, Session s) throws DataException { try { s.delete(findAccountByActNo(actNo,s)); } catch (HibernateException e) { e.printStackTrace(); throw new DataException("del error"); } } @Override public Account findAccountByActNo(String actNo, Session s) throws DataException { Account a = null; try { String hql = "from Account a " + "where a.actNo=?"; a = (Account)s.createQuery(hql) .setString(0, actNo) .uniqueResult(); } catch (HibernateException e) { e.printStackTrace(); throw new DataException("find error"); } return a; } @Override public void insert(Account act, Session s) throws DataException { try { s.saveOrUpdate(act); } catch (HibernateException e) { e.printStackTrace(); throw new DataException("save or update error"); } } @Override public void update(Account act, Session s) throws DataException { insert(act,s); } } public class AccountDAOFactory { public static IAccountDAO getDAO(String type){ IAccountDAO dao = null; if("hbn".equalsIgnoreCase(type)){ dao = new AccountDAOHbnImpl(); }else if("jdbc".equalsIgnoreCase (type)){ dao = new AccountDAOJdbcImpl(); } return dao; } } import com.tarena.ebank.biz.Account; import com.tarena.ebank.biz.AccountServiceFactory; import com.tarena.ebank.biz.IAccountService; public class Test { public static void main(String[] args) { IAccountService s = AccountServiceFactory.getService("hbn"); s.createAccount(new Account("a-001",12000.0)); s.createAccount(new Account("a-002",7000.0)); StringBuffer sb = new StringBuffer(); sb.append("a-001="+s.getBal("a-001")+"\n"); sb.append("a-002="+s.getBal("a-002")+"\n"); sb.append("从a-001转756.0到a-002\n"); s.transfer("a-001", "a-002", 756.0); sb.append("a-001="+s.getBal("a-001")+"\n"); sb.append("a-002="+s.getBal("a-002")+"\n"); System.out.print(sb.toString()); } } **************************************************************** 第三天 关联映射-基数映射-1:1 非常重要 注意的设计(Account3 主键) 唯一外健映射: public class Account3 { private Long oid; private String actNo; private double bal; private User3 owner; public void deposite(double amount) { bal = bal + amount; } public void withdraw(double amount) { bal = bal - amount; } public Account3(String actNo, double bal) { this.actNo = actNo; this.bal = bal; } public Account3() { super(); } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } public User3 getOwner() { return owner; } public void setOwner(User3 owner) { this.owner = owner; } } public class User3 { private Long oid; private String uid; private String name; private Account3 act; public User3() { } public User3(String uid, String name) { this.uid = uid; this.name = name; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Account3 getAct() { return act; } public void setAct(Account3 act) { this.act = act; act.setOwner(this);////////////注意 为Account中添加USER3 } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="Account3" table="t_act"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="actNo" column="ACTNO" not-null="true" unique="true"/> <property name="bal" column="BALANCE" not-null="true"/> <one-to-one name="owner" property-ref="act" cascade="save-update"></one-to-one>//主键 </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="User3" table="t_user"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="uid" column="USERID" not-null="true" unique="true"/> <property name="name" column="NAME" not-null="true"/> <many-to-one name="act" column="fid" unique="true" cascade="all"></many-to-one>//外健 </class> </hibernate-mapping> <?xml version="1.0"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@192.168.7.88:1521:tarena</property> <property name="connection.username">rensx</property> <property name="connection.password">rensx</property> <property name="connection.isolation">2</property> <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> <property name="myeclipse.connection.profile">rensx_oracle</property> <property name="hbm2ddl.auto">create</property> <mapping resource="hibernate/Account3.hbm.xml" /> <mapping resource="hibernate/User3.hbm.xml" /> </session-factory> </hibernate-configuration> 测试类******************* public class TestAcconut3 { public static void main(String[] args) { User3 u = new User3("u-001", "ren"); Account3 a = new Account3("act-001", 200.0); Session s = null; s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); u.setAct(a); try { s.save(u); s.getTransaction().commit(); s.beginTransaction(); String hql = "from User3 a where a.uid = ?"; Query q = s.createQuery(hql); User3 user = (User3) q.setString(0, "u-001").uniqueResult(); StringBuffer sb = new StringBuffer(); sb.append(user.getName() + ">>>>" + user.getAct().getBal()); System.out.println(sb.toString()); s.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } 共享主键方案:常用 Account oid 主键 User oid 主键 又是外健 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="Account" table="t_act"> <id name="oid" column="OID"> <generator class="hilo"> <param name="table">t_hilo</param> <param name="column">HI</param> </generator> </id> <property name="actNo" column="ACTNO"/> <property name="bal" column="BALANCE"/>//去除property-ref="act" </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="User3" table="t_user"> <id name="oid" column="OID"> <generator class="foreign">//写法 <param name="property">act</param>//写法 </generator> </id> <property name="uid" column="USERID" not-null="true" unique="true"/> <property name="name" column="NAME" not-null="true"/> <one-to-one name="act" cascade="all" constrained="true"></one-to-one>//写法 </class> </hibernate-mapping> 别的都一样 ************************************************************* 第四天 ont-to-many关系: 注意每个类中新添加的东西 package hibernate; public class Account4 { private Long oid; private String actNo; private double bal; private User4 owner; public Account4(String actNo, double bal) { super(); this.actNo = actNo; this.bal = bal; } public void deposite(double amount){ bal = bal + amount; } public void withdraw(double amount){ bal = bal - amount; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } public User4 getOwner() { return owner; } public void setOwner(User4 owner) { this.owner = owner; } public Account4() { super(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((actNo == null) ? 0 : actNo.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Account4 other = (Account4) obj; if (actNo == null) { if (other.actNo != null) return false; } else if (!actNo.equals(other.actNo)) return false; return true; } } package hibernate; import java.util.HashSet; import java.util.Set; public class User4 { private Long oid; private String uid; private String name; private Set<Account4> acts = new HashSet<Account4> (); public User4(String uid, String name) { super(); this.uid = uid; this.name = name; } public void addAct(Account4 act){ acts.add(act); act.setOwner(this); } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Account4> getActs() { return acts; } public void setActs(Set<Account4> acts) { this.acts = acts; } public User4() { super(); } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="Account4" table="t_act"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="actNo" column="ACTNO" not-null="true" unique="true"/> <property name="bal" column="BALANCE" not-null="true"/> <many-to-one name="owner" column="fid" cascade="save-update"></many-to-one> </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate"> <class name="User4" table="t_user"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="uid" column="USERID" not-null="true" unique="true"/> <property name="name" column="NAME" not-null="true"/> <set name="acts" cascade="all" inverse="true">//inverse 默认为false true为交出维护权 <key column="fid"/>//指明外健 Account4的fid为外健 <one-to-many class="Account4"></one-to-many>//说明set里的类型 </set> </class> </hibernate-mapping> package hibernate; import org.hibernate.HibernateException; import org.hibernate.Session; public class TestAccount4 { public static void main(String[] args) { User4 u = new User4("u-001", "Mike"); Account4 a = new Account4("act-001", 3000.0); u.addAct(a); a = new Account4("act-002",8000.0); u.addAct(a); Session s = null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); s.save(a); s.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } package hibernate; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; public class TestAccount4_2 { public static void main(String[] args) { Session s=null; try { s = HibernateUtil.getSessionFactory().openSession(); s.beginTransaction(); User4 u=(User4)s.get(User4.class, 20L); if(u==null){System.out.println("null");} else {System.out.println(u.getName());} // String hql="delete User4 a where a.name=?"; // Query q=s.createQuery(hql).setString(0, u.getName()); // q.executeUpdate(); s.delete(u);//可以级联删除 在 XML文件中的配置的级联删除只使用session的delete 是先删子表 // HQL不可级联删除 因为XML文件中的配置的级联删除不影响数据库的表结构的级联删除 s.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); s.getTransaction().rollback(); } finally { s.close(); HibernateUtil.release(); } } } 下午 many-to-many****************************** package hibernate.course; import java.util.HashSet; import java.util.Set; public class Student { private Long oid; private String sid; private String name; private Set cours = new HashSet(); public Student(String sid, String name) { super(); this.sid = sid; this.name = name; } public Student() { super(); } public void registerCour(Course c){ cours.add(c); c.getStus().add(this); } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getCours() { return cours; } public void setCours(Set cours) { this.cours = cours; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((sid == null) ? 0 : sid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Student other = (Student) obj; if (sid == null) { if (other.sid != null) return false; } else if (!sid.equals(other.sid)) return false; return true; } } package hibernate.course; import java.util.HashSet; import java.util.Set; public class Course { private Long oid; private String cid; private String name; private Set Stus = new HashSet(); public Course(String cid, String name) { super(); this.cid = cid; this.name = name; } public Course() { super(); } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getStus() { return Stus; } public void setStus(Set stus) { Stus = stus; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((cid == null) ? 0 : cid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Course other = (Course) obj; if (cid == null) { if (other.cid != null) return false; } else if (!cid.equals(other.cid)) return false; return true; } } <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.course"> <class name="Course" table="t_cour"> <id name="oid" column="OID" > <generator class="seqhilo" /> </id> <property name="cid" column="CID" unique="true" not-null="true"></property> <property name="name" column="NAME" not-null="true"/> <set name="stus" table="t_enrollment" cascade="save-update"> <key column="cfid" />//做为t_enrollment的外健 指向Course的主键 <many-to-many class="Student" column="sfid"/> </set> </class> </hibernate-mapping> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.course"> <class name="Student" table="t_stu"> <id name="oid" column="OID" > <generator class="seqhilo" /> </id> <property name="sid" column="SID" unique="true" not-null="true"></property> <property name="name" column="NAME" not-null="true"/> <set name="cours" table="t_enrollment" cascade="save-update" inverse="true"> <key column="sfid" /> <many-to-many class="Course" column="cfid"/> </set> </class> </hibernate-mapping> package hibernate.course; import java.util.Random; import org.hibernate.HibernateException; import org.hibernate.Session; public class TestManyToMany { public static void main(String[] args) { String[] sname = {"Mike","Tony","Jack","Rose","Black"}; String[] cname = {"Core Java","JDBC","Hibernate","Spring","JSP","EJB"}; Student[] s = new Student[sname.length]; Course[] c = new Course[cname.length]; for(int i=0;i<sname.length;i++){ s[i] = new Student("s-00"+i,sname[i]); } for(int i=0;i<cname.length;i++){ c[i] = new Course("c-00"+i,cname[i]); } for(int i=0;i<sname.length;i++){ for(int j=0;j<cname.length;j++){ if(new Random().nextInt()>0){ s[i].registerCour(c[j]); } } } Session ss = null; try { ss = HibernateUtil.getSessionFactory().openSession(); ss.beginTransaction(); ss.save(s[1]); ss.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); ss.getTransaction().rollback(); }finally{ ss.close(); HibernateUtil.release(); } } } 单一组件 双方为组合关系才可以使用单一组件 package hibernate.course; //组件单一 public class Account { private String actNo; private double bal;//属性的写法 无OID 实体类属性 public Account(String actNo, double bal) { this.actNo = actNo; this.bal = bal; } public Account() { super(); } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } } package hibernate.course; public class User { private Long oid;// private String uid; private String name; private Account act;//含有一个实体类 public User() { } public User(String uid, String name) { this.uid = uid; this.name = name; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Account getAct() { return act; } public void setAct(Account act) { this.act = act; } } <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.course"> <class name="User" table="t_user">//只写含有实体类属性的那个类的XML映射文件 <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="uid" column="USERID" not-null="true" unique="true"/> <property name="name" column="NAME" not-null="true"/> <component name="act">//与类的属性相对应 <property name="actNo" column="ACTNO" /> <property name="bal" column="BAL" /> </component> </class> </hibernate-mapping> 集合组件one-to-many package hibernate.test2; //集合组件 public class Account { private String actNo; private double bal; public Account(String actNo, double bal) { this.actNo = actNo; this.bal = bal; } public Account() { super(); } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((actNo == null) ? 0 : actNo.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Account other = (Account) obj; if (actNo == null) { if (other.actNo != null) return false; } else if (!actNo.equals(other.actNo)) return false; return true; } } package hibernate.test2; import java.util.HashSet; import java.util.Set; //集合组件 public class User { private Long oid; private String uid; private String name; private Set acts = new HashSet(); public void addAccount(Account act){ acts.add(act); } public User() { } public User(String uid, String name) { this.uid = uid; this.name = name; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getActs() { return acts; } public void setActs(Set acts) { this.acts = acts; } } <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.test2"> <class name="User" table="t_user2"> <id name="oid" column="OID" > <generator class="seqhilo"></generator> </id> <property name="uid" column="USERID" type="string" unique="true" not-null="true"></property> <property name="name" column="NAME" not-null="true" /> <set name="acts" table="t_acts2"> <key column="fid" /> <composite-element class="Account"> <property name="actNo" column="ACTNO" unique="true" not-null="true" /> <property name="bal" column="BAL" /> </composite-element> </set> </class> </hibernate-mapping> *************************************************************** 第五天 3种继承映射的实现 一个类一个表: package hibernate.test2; public abstract class Account { private Long oid; private String actNo; private double bal; private User owner; public Account(String actNo, double bal) { super(); this.actNo = actNo; this.bal = bal; } public void deposite(double amount){ bal = bal + amount; } public void withdraw(double amount){ bal = bal - amount; } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getActNo() { return actNo; } public void setActNo(String actNo) { this.actNo = actNo; } public double getBal() { return bal; } public void setBal(double bal) { this.bal = bal; } public User getOwner() { return owner; } public void setOwner(User owner) { this.owner = owner; } public Account() { super(); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((actNo == null) ? 0 : actNo.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Account other = (Account) obj; if (actNo == null) { if (other.actNo != null) return false; } else if (!actNo.equals(other.actNo)) return false; return true; } //*************** public void getMon(double mon){ bal=bal-mon; } } package hibernate.test2; public class CheckAccount extends Account { private double check;// public CheckAccount(){} public CheckAccount(String actNo, double bal, double check) { super(actNo, bal); this.check = check; } public CheckAccount(String actNo, double bal) { super(actNo, bal); } public void getMon(double mon){ double bal=getBal(); if(bal+check>mon){ bal=bal-mon; setBal(bal); } } public double getCheck() { return check; } public void setCheck(double check) { this.check = check; } } package hibernate.test2; public class DebitAccount extends Account { private double debit; public DebitAccount(){} public DebitAccount(String actNo, double bal) { super(actNo, bal); } public DebitAccount(String actNo, double bal, double debit) { super(actNo, bal); this.debit = debit; } public void getMon(double mon){ double bal=getBal(); if(bal-debit>=mon){ bal=bal-mon; setBal(bal); } } public double getDebit() { return debit; } public void setDebit(double debit) { this.debit = debit; } } package hibernate.test2; import java.util.HashSet; import java.util.Set; public class User { private Long oid; private String uid; private String name; private Set<Account> acts = new HashSet<Account> (); public User(String uid, String name) { super(); this.uid = uid; this.name = name; } public void addAct(Account act){ acts.add(act); act.setOwner(this); } public Long getOid() { return oid; } public void setOid(Long oid) { this.oid = oid; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Account> getActs() { return acts; } public void setActs(Set<Account> acts) { this.acts = acts; } public User() { super(); }} <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.test2"> <class name="Account" table="t_act"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="actNo" column="ACTNO" not-null="true" unique="true"/> <property name="bal" column="BALANCE" not-null="true"/> <many-to-one name="owner" column="fid" cascade="save-update"></many-to-one> <joined-subclass name="CheckAccount" table="t_checkAct"> <key column ="oid"/> <property name="check" column="ch" not-null="true"/> </joined-subclass> <joined-subclass name="DebitAccount" table="t_debitAct"> <key column ="oid"/> <property name="debit" column="DEBIT" not-null="true"/> </joined-subclass> </class> </hibernate-mapping> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.test2"> <class name="User" table="t_user"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="uid" column="USERID" not-null="true" unique="true"/> <property name="name" column="NAME" not-null="true"/> <set name="acts" cascade="all" inverse="true"> <key column="fid"/> <one-to-many class="Account"></one-to-many> </set> </class> </hibernate-mapping> 一个类库一个表: 别的跟上面一样 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.test2"> <class name="Account" table="t_act"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <discriminator column="TYPE"></discriminator>// <property name="actNo" column="ACTNO" not-null="true" unique="true"/> <property name="bal" column="BALANCE" not-null="true"/> <many-to-one name="owner" column="fid" cascade="save-update"></many-to-one> <subclass name="CheckAccount" discriminator-value="c"> <property name="check" column="ch"></property> </subclass> <subclass name="DebitAccount" discriminator-value="d"> <property name="debit" column="DEBIT"></property> </subclass> </class> </hibernate-mapping> 一个实体类一个表: 别的跟上面一样 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.test2"> <class name="Account" table="t_act"> <id name="oid" column="OID"> <generator class="seqhilo"> </generator> </id> <property name="actNo" column="ACTNO" not-null="true" unique="true"/> <property name="bal" column="BALANCE" not-null="true"/> <many-to-one name="owner" column="fid" cascade="save-update"></many-to-one> <union-subclass name="CheckAccount" table="t_check"> <property name="check" column="ch" not-null="true"/> </union-subclass> <union-subclass name="DebitAccount" table="t_debit"> <property name="debit" column="DEBIT" not-null="true" /> </union-subclass> </class> </hibernate-mapping> ************************************************* public class HbnUtil { private static SessionFactory sf; private static ThreadLocal<Session> local = new ThreadLocal<Session>(); public static SessionFactory getSessionFactory() { if (sf == null) { try { sf = new Configuration().configure().buildSessionFactory(); } catch (HibernateException e) { e.printStackTrace(); } } return sf; } public static Session getSession() { Session s = (Session) local.get(); if (s == null) { s = getSessionFactory().openSession(); local.set(s); } return s; } public static void closeSession() { Session s = (Session) local.get(); if (s != null) { s.close(); local.set(null); } } public static void closeSessionFactory() { if (sf != null) { sf.close(); sf = null; } } } ThreadLocal解决借口污染的电子银行代码