第24周J2EE SSH基础学习-Struts2和Hibernate整合实践

hibernate基础学习:关联关系

1. 单实体


2. 多实体关联
   a. 关联
   b. 聚合
   c. 组合
   
   1) 一对多关系是主流
             确认主控方,主控方一般是一方。关系是由多方来维持的。
             
            市民和公交卡   
            市民是强势方, 不需要去维护关系,因为关系不存在,它还可以安然存在。         
           公交卡是弱势方,如果不知道自己属于哪个市民,其将不复存在,所以公交卡需要去维护关系,需要去记住其所属的市民。在关系型数据中,关系就是外键。
           
           明星和粉丝
           
          一对多关系是这个世界的原生态的主流关系。
          
  2) 一对一关系是被限制的一对多
     a. 外键唯一约束
     
     table citizen
     cid   cname
     001   mary
     002   david
     
     table idcard
     cardno  carowner  issue_date
     c01     001       2016-1-1 
     c02     002       2016-1-2
          
     b. 主外键重合,通过主键来间接实现外键唯一约束
     
     > table citizen
     cid   cname
     001   mary
     002   david
     
     > table idcard
     cardno issue_date
     001    2016-1-1 
     002    2016-1-2
  
  3) 多对多是双向一对多。
  
  4) 多对一是反向一对多。

     

下面是基本的代码:一对一关系:驾驶员-驾车关系

Car.java 

/**
 * 工  程   名:HibernateOneToOneDemoPrj-20180526	<br>
 * 文  件   名:Car.java	<br>
 * 工具包名:edu.fjnu.domain	<br>
 * 功能描述:TODO	<br>
 * 创建时间:2018年5月26日 下午9:35:32	<br>
 * 版本信息:V1.0
 * @创建人:Zhou Kailun	
 */
package edu.fjnu.domain;

/**
 * 类名:Car	<br>
 * 功能描述:	<br> 
 * 创建日期:2018年5月26日 下午9:35:32	<br>
 * 修改备注:
 * @作者信息:Zhou kailun	<br>
 */
public class Car {
	/**汽车编号*/
	private Integer carNo;
	/**汽车品牌*/
	private String carBrand;
	/**汽车所属驾驶员*/
	private Person carOwner;
	/**<p>构造函数:</p><br><br>
	 * <p>描述:</p><br> 
	 */
	public Car() {
		// TODO Auto-generated constructor stub
	}
	public Integer getCarNo() {
		return carNo;
	}
	public void setCarNo(Integer carNo) {
		this.carNo = carNo;
	}
	public String getCarBrand() {
		return carBrand;
	}
	public void setCarBrand(String carBrand) {
		this.carBrand = carBrand;
	}
	public Person getCarOwner() {
		return carOwner;
	}
	public void setCarOwner(Person carOwner) {
		this.carOwner = carOwner;
	}
	public String toString() {
		return "Car [carNo=" + carNo + ", carBrand=" + carBrand + ", carOwner="
				+"owner" + "]";
	}

}

Person.java

/**
 * 工  程   名:HibernateOneToOneDemoPrj-20180526	<br>
 * 文  件   名:Person.java	<br>
 * 工具包名:edu.fjnu.domain	<br>
 * 功能描述:TODO	<br>
 * 创建时间:2018年5月26日 下午9:36:14	<br>
 * 版本信息:V1.0
 * @创建人:Zhou Kailun	
 */
package edu.fjnu.domain;

/**
 * 类名:Person	<br>
 * 功能描述:	<br> 
 * 创建日期:2018年5月26日 下午9:36:14	<br>
 * 修改备注:
 * @作者信息:Zhou kailun	<br>
 */
public class Person {
	/**人物编号*/
	private Integer personNo;
	/**人名*/
	private String personName;
	/**车辆信息*/
	private Car car;
	/**<p>构造函数:</p><br><br>
	 * <p>描述:</p><br> 
	 */
	public Person() {
		// TODO Auto-generated constructor stub
	}
	public Integer getPersonNo() {
		return personNo;
	}
	public void setPersonNo(Integer personNo) {
		this.personNo = personNo;
	}
	public String getPersonName() {
		return personName;
	}
	public void setPersonName(String personName) {
		this.personName = personName;
	}
	public Car getCar() {
		return car;
	}
	public void setCar(Car car) {
		this.car = car;
	}
	public String toString() {
		return "Person [personNo=" + personNo + ", personName=" + personName
				+ ", car=" + car + "]";
	}

}
 
 

Person.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="edu.fjnu.domain">
	<!-- 人物信息与数据库匹配 -->
	<class name="Person" table="tbl_person">
	 	<id name="personNo" column="person_no" type="java.lang.Integer" >
	 		<generator class="increment"/>
	 	</id>
		<property name="personName" column="person_name" type="java.lang.String" length="30" not-null="true"></property>
		<!-- 
			1.class="Car"
				说明这个属性是Car对象
			2:property-ref="carOwner"
			你去查找所有Car的carOwner对象与我这个
		 -->
		<one-to-one name="car" class="Car" property-ref="carOwner" cascade="all"></one-to-one>
	</class>
</hibernate-mapping>

Car.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="edu.fjnu.domain">
	<!-- 车辆信息与数据库匹配 -->
	<class name="Car" table="tbl_car">
		<id name="carNo" column="car_no" type="java.lang.Integer" length="4">
			<generator class="assigned"></generator>
		</id>
		<property name="carBrand" column="car_brand" type="java.lang.String" length="30" not-null="true"></property>
		<!-- 
			1.class="Person"
			  select * from tbl_person
			2.column="car_owner"
			  select * from tbl_person where person_no =?
		 -->
		<many-to-one name="carOwner" class="Person" column="car_owner" unique="true"></many-to-one>
	</class>
</hibernate-mapping>

Tester.java  测试文件Junit4测试

package edu.fjnu.test;

import static org.junit.Assert.*;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import edu.fjnu.domain.Car;
import edu.fjnu.domain.Person;

public class Tester {
	private SessionFactory factory;
	private Session session;
	@Before
	public void setUp() throws Exception {
		System.out.println("test prepared.....");
		Configuration config=new Configuration();//构建一个配置器
		config.configure("/edu/fjnu/config/hibernate.cfg.xml");
		factory =config.buildSessionFactory();
		session=factory.openSession();
	}

	@After
	public void tearDown() throws Exception {
		System.out.println("test clear....");
		if(session.isOpen())
			session.close(); 
		if(!factory.isClosed())
			factory.close();
	} 
	@Test
	public void testAdd(){
		Car car=new Car();
		car.setCarNo(003);
		car.setCarBrand("toney");
		
		Person person=new Person();
		person.setPersonName("jenny");
		
		car.setCarOwner(person);
		person.setCar(car);
		
		Transaction trans=null;
		
		try{
			trans=session.beginTransaction();
			session.save(person);
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}
	}
	
	@Test
	public void testSearch()throws Exception{
		Transaction trans=null;
		String hql="from Person p where p.personName like 'm%' and p.car.carBrand like '%one%' order by p.personNo desc";
		
		try{
			trans=session.beginTransaction();
			List data=session.createQuery(hql).list();
			for(Object obj:data){
				Person p=(Person)obj;
				System.out.println(p);
			}
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}
	}
	@Test 
	public void testChangeCar()throws Exception{
		Transaction trans=null;
		
		Car car=new Car();
		car.setCarNo(003);
		car.setCarBrand("superGone");
		try{
			trans=session.beginTransaction();
			
			Person person=(Person)session.load(Person.class,new Integer(3));
			person.getCar().setCarOwner(null);
			person.setCar(null);
			session.saveOrUpdate(person);
			session.flush();
			
			person.setCar(car);
			car.setCarOwner(person);
			
			session.saveOrUpdate(person);
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}
	}
	@Test
	public void testRemove()throws Exception {
		Transaction trans=null;
		 
		try{
			trans=session.beginTransaction();
			Person person=(Person)session.load(Person.class, new Integer(1));
			person.getCar().setCarOwner(null);
			person.setCar(null);
			
			session.delete(person); 
			
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}
	}
	@Test
	public void testUpdate()throws Exception {
		Transaction trans=null;
		 
		try{
			trans=session.beginTransaction();
			Person person=(Person)session.load(Person.class, new Integer(2));


			Car car=person.getCar();
			car.setCarBrand("ford");
			
			session.saveOrUpdate(person); 
			
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}
	}
}

然后是原来的SMS-SSH 的整合 学生管理系统

User.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="edu.fjnu.training.domain">
	<!-- 用户信息与数据库匹配 -->
	<class name="User" table="tbl_user">
	 	<id name="userNo" column="user_no" type="java.lang.String" length="6"></id>
		<property name="userName" column="user_name" type="java.lang.String" length="30" not-null="true"></property>
		<property name="userPwd" column="user_pwd" type="java.lang.String" length="6" not-null="true"></property>
	</class>
</hibernate-mapping>

Student.hbml.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="edu.fjnu.training.domain">
	<!-- 学生信息与数据库匹配 -->
	<class name="Student" table="tbl_student">
	 	<id name="stuNo" column="stu_no" type="java.lang.String" length="4"></id>
		<property name="stuName" column="stu_name" type="java.lang.String" length="30" not-null="true"></property>
		<property name="stuMark" column="stu_mark" type="java.lang.Integer" length="11"></property>
		<property name="stuSex"  column="stu_sex" type="java.lang.String" length="2"></property>
		<property name="stuHobbyStr" column="stu_hobbies" type="java.lang.String" length="30"></property>
		<property name="stuOrigin"  column="stu_origin" type="java.lang.String" length="2"></property>
		<property name="stuMemo" column="stu_memo" type="java.lang.String" length="30"></property>
		<property name="stuPic" column="stu_pic" type="binary"></property>
		
	
	</class>
</hibernate-mapping>

UserDaoHibernateImpl.java

/**
 * 工  程   名:SMS-SSH-20180524	<br>
 * 文  件   名:UserDaoHibernateImpl.java	<br>
 * 工具包名:edu.fjnu.training.dao	<br>
 * 功能描述:TODO	<br>
 * 创建时间:2018年5月26日 下午7:25:47	<br>
 * 版本信息:V1.0
 * @创建人:Zhou Kailun	
 */
package edu.fjnu.training.dao;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.TransactionException;

import edu.fjnu.training.domain.User;
import edu.fjnu.training.exception.DataAccessException;
import edu.fjnu.training.utils.HibernateUtils;

/**
 * 类名:UserDaoHibernateImpl	<br>
 * 功能描述:	<br> 
 * 创建日期:2018年5月26日 下午7:25:47	<br>
 * 修改备注:
 * @作者信息:Zhou kailun	<br>
 */
public class UserDaoHibernateImpl implements UserDao {

	/**<p>构造函数:</p><br><br>
	 * <p>描述:</p><br> 
	 */
	public UserDaoHibernateImpl() {
		// TODO Auto-generated constructor stub
	}

	/* (非 Javadoc)
	 * <p>Title:getUserByNo</p>
	 * <p>描       述:</p>
	 * @param userNo
	 * @return
	 * @see edu.fjnu.training.dao.UserDao#getUserByNo(java.lang.String)
	 */
	@Override
	public User getUserByNo(String userNo) {
		Session session=HibernateUtils.createSession();
		Transaction trans=null;
		trans=session.beginTransaction();
		User user=null;
		try{
			user=session.get(User.class, userNo);
			trans.commit();
		}catch(TransactionException e){
			e.printStackTrace(); 
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		}
		if(user==null)
			throw new DataAccessException("账号不存在");
		return user;
	}

	@Override
	public void delUser(String userNo) {
//		Session session=HibernateUtils.createSession();
//		Transaction trans=null;
//		trans=session.beginTransaction();
//	 
//		try{
//			session.delete(userNo);
//			trans.commit();
//		}catch(TransactionException e){
//			e.printStackTrace();
//			trans.rollback();
//		} 
	}

}

StudentDaoHibernateImpl.java

/**
 * 工  程   名:SMS-SSH-20180524	<br>
 * 文  件   名:StudentDaoHibernateImpl.java	<br>
 * 工具包名:edu.fjnu.training.dao	<br>
 * 功能描述:TODO	<br>
 * 创建时间:2018年5月26日 下午8:28:07	<br>
 * 版本信息:V1.0
 * @创建人:Zhou Kailun	
 */
package edu.fjnu.training.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import edu.fjnu.training.domain.Student;
import edu.fjnu.training.utils.HibernateUtils;

/**
 * 类名:StudentDaoHibernateImpl	<br>
 * 功能描述:	<br> 
 * 创建日期:2018年5月26日 下午8:28:07	<br>
 * 修改备注:
 * @作者信息:Zhou kailun	<br>
 */
public class StudentDaoHibernateImpl implements StudentDao {

	/**<p>构造函数:</p><br><br>
	 * <p>描述:</p><br> 
	 */
	public StudentDaoHibernateImpl() {
		// TODO Auto-generated constructor stub
	}

	/* (非 Javadoc)
	 * <p>Title:addStudent</p>
	 * <p>描       述:</p>
	 * @param stu
	 * @see edu.fjnu.training.dao.StudentDao#addStudent(edu.fjnu.training.domain.Student)
	 */
	@Override
	public void addStudent(Student stu) {
		Session session=HibernateUtils.createSession();
		Transaction trans=null;
		trans=session.beginTransaction();;
		try{
			session.saveOrUpdate(stu);
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		}
	}

	/* (非 Javadoc)
	 * <p>Title:removeStudent</p>
	 * <p>描       述:</p>
	 * @param stuNo
	 * @see edu.fjnu.training.dao.StudentDao#removeStudent(java.lang.String)
	 */
	@Override
	public void removeStudent(String stuNo) {
		Session session=HibernateUtils.createSession();
		Transaction trans=null;
		trans=session.beginTransaction();;
		try{
			Student stu=session.load(Student.class, stuNo);
			
			session.delete(stu);
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		}
	}

	/* (非 Javadoc)
	 * <p>Title:loadAllStudent</p>
	 * <p>描       述:</p>
	 * @return
	 * @see edu.fjnu.training.dao.StudentDao#loadAllStudent()
	 */
	@Override
	public List<Student> loadAllStudent() {
		Session session=HibernateUtils.createSession();
		Transaction trans=null;
		List<Student> stuList=null;
		
		trans=session.beginTransaction(); 
		try{
			String hql="from Student s order by s.stuNo desc";//查询语句
			stuList=session.createQuery(hql).list(); 
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		}
		return stuList;
	}

	/* (非 Javadoc)
	 * <p>Title:getStudentByStuNo</p>
	 * <p>描       述:</p>
	 * @param stuNo
	 * @return
	 * @see edu.fjnu.training.dao.StudentDao#getStudentByStuNo(java.lang.String)
	 */
	@Override
	public Student getStudentByStuNo(String stuNo) {
		Session session=HibernateUtils.createSession();
		Transaction trans=null;
		Student stu=null;
		
		trans=session.beginTransaction(); 
		try{
			stu=session.get(Student.class, stuNo);
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		}
		return stu;
	}

	/* (非 Javadoc)
	 * <p>Title:updateStudent</p>
	 * <p>描       述:</p>
	 * @param stu
	 * @see edu.fjnu.training.dao.StudentDao#updateStudent(edu.fjnu.training.domain.Student)
	 */
	@Override
	public void updateStudent(Student stu) {
		Session session=HibernateUtils.createSession();
		Transaction trans=null; 
		
		trans=session.beginTransaction(); 
		try{

			if(stu.getStuPic()==null || stu.getStuPic().length==0){
				stu.setStuPic(this.loadStuPicByNo(stu.getStuNo()));
			}
			session.saveOrUpdate(stu);;
			trans.commit();
		}catch(HibernateException e){
			e.printStackTrace();
			trans.rollback();
		}finally{
			if(session.isOpen()){
				session.close();
			}
		} 

	}

	/* (非 Javadoc)
	 * <p>Title:loadStuPicByNo</p>
	 * <p>描       述:</p>
	 * @param stuNo
	 * @return
	 * @see edu.fjnu.training.dao.StudentDao#loadStuPicByNo(java.lang.String)
	 */
	@Override
	public byte[] loadStuPicByNo(String stuNo) {
		return this.getStudentByStuNo(stuNo).getStuPic();
	}

}

猜你喜欢

转载自blog.csdn.net/qq_36346496/article/details/80466209