Hibernate关联查询 一对多双向关联
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();
- }
- }
版权声明:本文为spghs原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。