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;
private 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>