6.Hibernate单向的多对一 关联映射

时间:2021-04-01 19:40:09

1.创建如下项目结构

2.在项目的src下创建hibernate.cfg.xml主配置文件

 <?xml version="1.0" encoding="UTF-8"?>
<!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="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="com/entity/Dept.hbm.xml"/>
<mapping resource="com/entity/Emp.hbm.xml"/>
</session-factory>
</hibernate-configuration>

hibernate.cfg.xml

3.在项目的src下的com.entity包下创建Dept.java

 package com.entity;

 public class Dept {
/**
* 部门编号
*/
private int deptno;
/**
* 部门名称
*/
private String dname;
/**
* 部门位置
*/
private String loc;
public Dept() {
}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc
+ "]";
} }

Dept

4.在项目的src下的com.entity包下创建Emp.java

 package com.entity;

 import java.util.Date;

 public class Emp {
/**
* 员工编号
*/
private Integer empno;
/**
* 员工姓名
*/
private String ename;
/**
* 员工工作
*/
private String job;
/**
* 员工领导编号
*/
private Integer mgr;
/**
* 员工雇佣日期
*/
private Date hiredate;
/**
* 员工工资
*/
private Integer sal;
/**
* 员工奖金
*/
private Integer comm;
/**
* 部门外键
* 引入部门对象
*/
private Dept dept;
public Emp() {
super();
}
public Emp(Integer empno, String ename, String job, Integer mgr,
Date hiredate, Integer sal, Integer comm, Dept dept) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
this.dept = dept;
} public Integer getEmpno() {
return empno;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public Integer getSal() {
return sal;
}
public void setSal(Integer sal) {
this.sal = sal;
}
public Integer getComm() {
return comm;
}
public void setComm(Integer comm) {
this.comm = comm;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp [comm=" + comm + ", dept=" + dept + ", empno=" + empno
+ ", ename=" + ename + ", hiredate=" + hiredate + ", job="
+ job + ", mgr=" + mgr + ", sal=" + sal + "]";
} }

Emp.java

5.在项目的src下的com.entity包下创建Dept.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>
<class name="com.entity.Dept" table="DEPT" schema="SCOTT">
<!-- 主键配置 -->
<id name="deptno" type="java.lang.Integer" column="DEPTNO">
<!-- 主键由应用程序负责生成 -->
<generator class="assigned"/>
</id>
<!-- 部门名称 -->
<property name="dname" type="java.lang.String" column="DNAME"/> <!-- 部门位置 -->
<property name="loc" type="java.lang.String" column="LOC"/>
</class>
</hibernate-mapping>

Dept.hbm.xml

6.在项目的src下的com.entity包下创建Emp.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>
<class name="com.entity.Emp" table="EMP" schema="scott">
<id name="empno" type="java.lang.Integer" column="EMPNO">
<generator class="assigned"/>
</id>
<property name="ename" type="java.lang.String" column="ENAME"/>
<property name="job" type="java.lang.String" column="JOB"/>
<property name="mgr" type="java.lang.Integer" column="MGR"/>
<property name="hiredate" type="java.util.Date" column="HIREDATE"/>
<property name="sal" type="java.lang.Integer" column="SAL"/>
<property name="comm" type="java.lang.Integer" column="COMM" not-null="false" /> <!-- 多对一映射:name是emp中外键字段引用的对象,class是对象的类型,column是数据库中对应的外键列字段名 -->
<many-to-one name="dept" class="com.entity.Dept" column="DEPTNO"/>
</class>
</hibernate-mapping>

Emp.hbm.xml

7.在项目的src下的com.util包下创建HibernateUtil.java

 package com.util;

 import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
/**
* 创建线程池来管理Session
*/
private static ThreadLocal<Session> thread=new ThreadLocal<Session>();
/**
* 创建读取配置文件的对象
*/
private static Configuration config=null;
/**
* 创建获取Session的工厂
*/
private static SessionFactory factory=null; /**
* 读取配置文件
*/
static{
try {
config=new Configuration().configure("/hibernate.cfg.xml");
factory=config.buildSessionFactory();
} catch (HibernateException e) {
System.out.println("读取配置文件或创建SessionFactory失败!");
e.printStackTrace();
}
} /**
* 获取session
* @return
*/
public static Session getSession(){
Session session=thread.get();
if(session==null){
session=factory.openSession();
thread.set(session);
}
return session;
} /**
* 关闭Session
*/
public static void closeSession(){
Session session=thread.get();
thread.set(null);
session.close();
} }

HibernateUtil.java

8.在项目的src下的com.dao包下创建EmpDao.java

 package com.dao;

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.SimpleFormatter; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import com.entity.Dept;
import com.entity.Emp;
import com.util.HibernateUtil; public class EmpDao { public static void main(String[] args) {
System.out.println("--------------------1.保存:1部门和2员工-----3条sql------------------");
//saveEmp();
System.out.println("----------------2.根据部门编号,查询该部门下的所有员工--2条sql--------------");
//getEmpByDeptNo(1);
System.out.println("----------------3.查询所有员工--5条sql--------------");
//getEmp();
System.out.println("----------------4.删除--------------------------------------");
//deleteEmp(1); System.out.println("-----------------5.修改-----2个sql---------------------");
updateEmp(2); }
/**
* 5.修改
* @param i
*/
private static void updateEmp(int id) {
Session session=HibernateUtil.getSession();
//2.开启事务
Transaction tx=session.beginTransaction();
//查单条
Emp emp=(Emp) session.get(Emp.class, id);
if(emp!=null){
emp.setEname("小猪");
System.out.println("修改成功");
}else{
System.out.println("该条数据不存在");
}
tx.commit();
HibernateUtil.closeSession(); }
/**
* 4.删除
* @param id
*/
private static void deleteEmp(int id) {
Session session=HibernateUtil.getSession();
//2.开启事务
Transaction tx=session.beginTransaction();
//查单条
Emp emp=(Emp) session.get(Emp.class, id);
if(emp!=null){
session.delete(emp);
System.out.println("删除成功");
}else{
System.out.println("该条数据不存在");
}
tx.commit();
HibernateUtil.closeSession(); }
/**
* -3.查询所有员工--2条sql
* 如果会报出: Null value was assigned to a property of primitive type setter of com.entity.Emp.comm异常
* 表示comm奖金字段为null,映射是Integer类型,而实体类里是int类型,int基本数据类型值没有null,所以报错
* 解决方法:将实体类所有字段数据类型改为引用数据类型
*/
private static void getEmp() {
Session session=HibernateUtil.getSession();
String hql="from Emp";
Query query=session.createQuery(hql);
List<Emp> list=query.list();
for (Emp emp : list) {
System.out.println("部门编号:"+emp.getDept().getDeptno()+"\t部门名称:"+emp.getDept().getDname()+"\t员工姓名:"+emp.getEname());
} HibernateUtil.closeSession(); }
/**
* 2.根据部门编号,查询该部门下的所有员工
* 2条sql
* @param i
*/
private static void getEmpByDeptNo(int id) {
//1.开启Session
Session session=HibernateUtil.getSession(); String hql="from Emp e where e.dept.deptno=:pdeptno";
Query query=session.createQuery(hql);
query.setParameter("pdeptno", id);
List<Emp> list=query.list();
for (Emp emp : list) {
System.out.println(emp);
}
//5.关闭Session
HibernateUtil.closeSession(); }
/**
* 1.保存:1部门和2员工-----3条sql
*/
private static void saveEmp() {
//1.开启Session
Session session=HibernateUtil.getSession(); //2.开启事务
Transaction tx=session.beginTransaction(); //3.执行操作
//创建部门对象
Dept dept=new Dept(1, "质控部", "中部"); //保存dept对象
session.save(dept);
System.out.println("Dept保存成功"); Date date=null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("2013-3-3");
} catch (ParseException e) {
e.printStackTrace();
} //创建员工对象
Emp emp1=new Emp(1, "holly", "教员", 2, date, 2300, 200, dept);
Emp emp2=new Emp(2, "猪猪", "领导", 1, date, 3000, 200, dept); //保存Emp对象
session.save(emp1); //保存Emp对象
session.save(emp2);
System.out.println("Emp保存成功"); //4.提交事务
tx.commit(); //5.关闭Session
HibernateUtil.closeSession();
} }

EmpDao.java

9.结果自己验证...