Dept实体类
public class Dept { private Integer deptno; private String deptname; public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } private Set<Emp> emps=new HashSet<Emp>(); public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public String getDeptname() { return deptname; } public void setDeptname(String deptname) { this.deptname = deptname; } }
Emp实体类
public class Emp { private Integer empno; private String empname; //植入部门单个对象 private Dept dept; public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEmpname() { return empname; } public void setEmpname(String empname) { this.empname = empname; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } }
Dept.hbm.xml小配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.hibernate.day1228"> <!--实体 name=实体端的内容 column=DB端的内容--> <class name="Dept" table="Dept" schema="zyx"> <!--和底层数据表对应的主键 业务意义--> <id name="deptno" column="deptno"> <!--主键生成策略 :assigned:程序员手动给值--> <generator class="native"/> </id> <property name="deptname" column="deptname"></property>
<!-- 一对多 1个部门 多个员工-->
<set name="emps" cascade="save-update" inverse="true"> <key column="deptno"></key> <one-to-many class="Emp"></one-to-many> </set> </class> </hibernate-mapping>
Emp.hbm.xml小配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="cn.hibernate.day1228"> <!--实体 name=实体端的内容 column=DB端的内容--> <class name="Emp" table="EMP" schema="zyx"> <!--和底层数据表对应的主键 业务意义--> <id name="empno" column="empno"> <!--主键生成策略 :assigned:程序员手动给值--> <generator class="native"/> </id> <property name="empname" column="empname"></property> <!-- 多对一 emp多的一方 dept一的一方
name:再多的一方植入的一的一方的对象名
class:再多的一方植入的一德一方的类型名
column:在当前分析的对象对应的底层表的外列的值
--> <many-to-one name="dept" class="Dept" column="deptno"></many-to-one> </class> </hibernate-mapping>
hibernate.cfg.xml大配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!--创建Session的基础配置--> <session-factory> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">zyx</property> <property name="connection.password">zyx</property> <!-- SQL dialect (方言)--> <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property> <!-- Echo all executed SQL to stdout 在控制台打印sql --> <property name="show_sql">true</property> <!--格式化SQL--> <property name="format_sql">true</property> <!-- Drop and re-create (重新创建)the database schema(架构) on startup (启动) 是否根据hbm.xml自动建表 建表的策略 update create --> <property name="hbm2ddl.auto">update</property> <!--关联小配置 --> <mapping resource="cn/hibernate/day1228/Dept.hbm.xml"/> <mapping resource="cn/hibernate/day1228/Emp.hbm.xml"/> </session-factory> </hibernate-configuration>
测试
public class Test20171228sql { Configuration cfg; Session session; Transaction tx; SessionFactory factory; @Before public void myBefore(){ //创建配置对象 cfg=new Configuration().configure(); // 2.根据配置对象创建SessionFactory factory=cfg.buildSessionFactory(); //3.根据SessionFactory去创建Session session= factory.openSession(); //3.5在Session创建后开启事务 xxx0001 xxxxx003 tx= session.beginTransaction(); } //关联查询 多对一单向关联 @Test public void t5(){ //提供一个员工的编号 Emp emp=session.load(Emp.class,1); System.out.println(emp.getEmpname()); //隶属的部门 System.out.println(emp.getDept().getDeptname()); tx.commit(); session.close(); } //添加部门的同时添加员工 @Test public void t7(){ Dept dept=new Dept(); dept.setDeptname("nv部"); Emp emp=new Emp(); emp.setEmpname("666"); emp.setDept(dept); //将部门的引入绑定到员工对象的一个属性上 dept.getEmps().add(emp); session.save(dept); tx.commit(); } //修改员工表的部门编号 @Test public void t10(){ Emp emp=(Emp)session.get(Emp.class,1); Dept dept=(Dept) session.get(Dept.class,1); emp.setDept(dept); tx.commit(); session.close(); } //一队多双向关联 @Test public void t6(){ //可以通过部门获取该部门下所有员工(因为设置了从部门到员工的一对多的关联) String hql="from Dept"; Query query=session.createQuery(hql); List<Dept> list=query.list(); for (Dept dept:list){ System.out.println(dept.getDeptname()+"============="); //部门中有哪些员工 for (Emp emp:dept.getEmps()){ System.out.println(emp.getEmpname()); } System.out.println("=========End================"); } //可以通过某个员工获取该员工所在的部门(因为设置了从员工到部门的多对一的关联) Emp emp=session.load(Emp.class,1); System.out.println(emp.getDept().getDeptname()); tx.commit(); session.close(); } }