您的位置:首页 > 其它

Hibernate的一个多表例子.仅供今后学习复习参考.还请指教.

2007-05-22 16:48 435 查看
1.总结一下
首先Hibernate的生命周期
Configuration
SessionFactory
Session
Transaction                   以上是第一:临时transient,数据只在内存中有

业务

                                       提交之前是第二:在Session和数据库内都有数据,内存中也应该有      
tr.commit();
                                      第三:只在数据库里有数据.              
session.close();

2.垃圾回收机制

  自动的:懒惰,jvm采用懒惰的在没有资源的时候才回收可见不好.
         积极的

  手动的
3.
通过一个例子来时下Hibernate下的多对多关系.
首先要建数据库:
  这里采用多增加一个表的策略
表一:create table students(
sid int not null primary key AUTO_INCREMENTS,
name varchar(33) not null,
sex  varchar(8),
birthday date,
edu varchar(66),
cardnumber varchar(16) not null unique
);
create table courses(
cid int primary key,
coursename varchar(32) not null unique,
describ varchar(256)
);
create table enrollments(
cid int references courses(cid),
sid int references students(sid),
constraint enrollments_pk primary key(cid,sid)
);
分析一下,一个学生可以选多门课程,一门课程也可以被多名学生来选.
增加一个表来是实现学生表和课程表的连接.
写类.
在这里我们利用一个接口..
接口定义:

package util;

import java.util.Set;
import java.util.List;
import com.*;
 public interface HibernateADO{
  public void newStudent(Student s);
  public void newCourse(Course c);
  public void register(Student s, Course c);
  public void withdraw(Student s, Course c);
  public Set getAllStudent();
  public Set getAllCourse();
  public Student getStudentByCardNumber(String cardnumber);
  public Course getCourseByName(String name);
  public void clear();
  public List getNamePairs();
 }//接口的作用,工厂模式的体现,深入体会一下

一个常用实用的类
package util;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public  class UtilADO  {
 static Configuration cfg=new Configuration().configure();
 static SessionFactory sf=cfg.buildSessionFactory();
 public static Session config(){
   
    Session s=sf.openSession();
    return s;
   }
   public static void clear(){
    sf.close();
     
   }
 
}
对接口的类实现
package util;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.hibernate.*;

import com.Course;
import com.Student;

public class HibernateADO_Class implements HibernateADO{

 public void clear() {//实现清除
  UtilADO.clear();
 }

 public Set getAllCourse() {
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   //实现从course表中查询出所有记录到set
   Set set = new HashSet(s.createQuery("from Course").list());
   tr.commit();
   return set;
   }catch(HibernateException he){
   tr.rollback();
   throw he;
     }finally{
   s.close();
  }

 }

 public Set getAllStudent() {
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   //实现从course表中查询出所有记录到set
   Set set = new HashSet(s.createQuery("from Student").list());
   tr.commit();
   return set;
   }catch(HibernateException he){
   tr.rollback();
   throw he;
     }finally{
   s.close();
  }
 }

 public Course getCourseByName(String name) {
 //通过课程名查询
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   Course c = (Course)s.createQuery("from Course c where c.name=:n")
    .setString("n", name).uniqueResult();
    tr.commit();
    return c;
  }catch(HibernateException he){
   tr.rollback();
   throw he;
  }
 }

 public List getNamePairs() {//得出学生名和课程名
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   Query q = s.createQuery("select new com.many2many.Name_Name(s.name, c.name) from Student s join

s.courses c");  
      List l = q.list();
   tr.commit();
   return l;
  }catch(HibernateException he){
   tr.rollback();
   throw he;
  }
 }

 public Student getStudentByCardNumber(String cardnumber) {//根据学生对象的cardnumber值来查询
  
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   Student student = (Student)s.createQuery("from Student s where s.name=:studentNumber")
    .setString("studentNumber", cardnumber).uniqueResult();
    tr.commit();
    return student;
  }catch(HibernateException he){
   tr.rollback();
   throw he;
  }finally{
   s.close();
  }
 }

 public void newCourse(Course c) {//实现课程类的持久化
  Session s=UtilADO.config();
  Transaction tr=s.beginTransaction();
  try{
   s.save(c);
   tr.commit();
  }catch(HibernateException e){
   e.printStackTrace();
  }finally{
     s.close(); 
  }  
  
 }

 public void newStudent(Student s) {//实现了学生类的持久化
  Session session=UtilADO.config();
  Transaction tr=session.beginTransaction();
  try {
   session.save(s);
   tr.commit();
  } catch (HibernateException e) {
   
   e.printStackTrace();
  }finally{
   session.close();
  }
  
 }

 public void register(Student s, Course c) {//实现了学生和课程的连接
  Session session=UtilADO.config();
  Transaction tr=session.beginTransaction();
  try {
   s.registerCourse(c);
   session.saveOrUpdate(s);
   tr.commit();
  } catch (HibernateException e) {
   
   e.printStackTrace();
  }finally{
   session.close();
  }
  
 }

 public void withdraw(Student s, Course c) {//实现删除脱离学生和课程的关系
  Session session=UtilADO.config();
  Transaction tr=session.beginTransaction();
  try {
   s.withdrawCourse(c);
   session.saveOrUpdate(s);
   tr.commit();
  } catch (HibernateException e) {
      e.printStackTrace();
  }finally{
   session.close();
  }
 }

}
学生类和课程类
package com;

import java.util.*;

public class Student {
    private int sid;
    private String name;
    private String sex;
    private Date birthday;
    private String edu;
    privat
4000
e String cardnumber;
    private Set courses=new HashSet();
   
 public Student() {

 }
 public Student(String name, String sex, Date birthday, String edu, String cardnumber) {
  super();
  this.name = name;
  this.sex = sex;
  this.birthday = birthday;
  this.edu = edu;
  this.cardnumber = cardnumber;
 }
 public void registerCourse(Course course){
  courses.add(course);//把课程加进来
     course.getStudents().add(this);//把学
  
 }
 public void withdrawCourse(Course course){
  courses.remove(course);//把课程删去
  course.getStudents().remove(this);//把学生删去
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 public String getCardnumber() {
  return cardnumber;
 }
 public void setCardnumber(String cardnumber) {
  this.cardnumber = cardnumber;
 }
 public String getEdu() {
  return edu;
 }
 public void setEdu(String edu) {
  this.edu = edu;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public int getSid() {
  return sid;
 }
 public void setSid(int sid) {
  this.sid = sid;
 }
 public Set getCourses(){
  return this.courses;
 }
 public void setCourses(Set courses){
  this.courses=courses;
 }
 public boolean equals(Object o){
  if(!(o instanceof Student)) return false;
  Student s = (Student)o;
  return s.cardnumber.equals(cardnumber);
 }
 
 public int hashCode(){
  return cardnumber.hashCode();
 }
}
package com;

import java.util.*;

public class Course {
 private Integer cid;
 private String name;
 private String desc;
 private Set students = new HashSet();
 public Integer getCid() {
  return cid;
 }
 public void setCid(Integer cid) {
  this.cid = cid;
 }
 public String getDesc() {
  return desc;
 }
 public void setDesc(String desc) {
  this.desc = desc;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Set getStudents() {
  return students;
 }
 public void setStudents(Set students) {
  this.students = students;
 }
 public Course(String name, String desc) {
  super();
  this.name = name;
  this.desc = desc;
 }
 
 
 
}
功能类
package manage;
import java.util.Date;

import org.hibernate.*;
import com.*;
import util.*;
public class Manage {
  public static void main(String[] args) {
 Session s=UtilADO.config();
 Transaction tr=s.beginTransaction();
 
 Student s1=new Student("tao","男",new Date(),"student","100003");
 Student s2=new Student("yu","男",new Date(),"student","100002");
 Course c1=new Course("java_1","学习java核心基础");
 Course c2=new Course("c++_1","学习c++核心基础");
 s1.registerCourse(c1);
 s1.registerCourse(c2);
 s.save(s1);
 s2.registerCourse(c1);
 s.save(s2);
 tr.commit();
 
 
}
}

配置文件,今日重点.
<?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">
   <class name="Student" table="students">
    <id name="sid" unsaved-value="null">
      <generator class="hilo">
        <param name="table">enrollments</param>
        <param name="column">cid</param>
      </generator>
    </id>
     <property name="name"></property> 
     <property name="sex"></property>
     <property name="birthday"></property>
     <property name="edu"></property>
      <property name="cardnumber" unique="true" not-null="true"></property>
      <set name="courses" table="enrollments" inverse="true" cascade="all">
         <key column="sid"></key>
         <many-to-many class="Course" column="cid"></many-to-many>        
        </set>
   </class>  
   <class name="Course" table="courses">
     <id name="cid" unsaved-value="null">
       <generator class="hilo">
       <param name="table">enrollments</param>
       <param name="column">sid</param>
       </generator>   
       </id>
       <property name="name" column="coursename"></property>
       <property name="desc" column="describ"></property>
       <set name="students" table="enrollments" cascade="all">
          <key column="cid"></key>
          <many-to-many class="Student" column="sid"></many-to-many>
       </set>
   </class>
 
</hibernate-mapping>

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息