Hibernate级联查询(多对一)_其他



当关联关系配置双向时,一方的set集合中inverse属性应设置为true。此时在级联操作时应将双方对象设置关联。


若关联关系为单向一对多时,inverse属性不可设置为true,用于保障级联操作时外键完整性。(和查询没关系,)



一:创建表

-- 创建部门和员工信息表
create table dept 
(
    did number(7) primary key,
    deptName varchar2(20) not null
);

create table emp
(
    eid number(7) primary key,
    empName varchar2(20) not null,
    deptid number(7) references dept(did)
);

create sequence seq_dept;
create sequence seq_emp;

insert into dept values(seq_dept.nextval,'开发部');
insert into dept values(seq_dept.nextval,'测试部');
insert into dept values(seq_dept.nextval,'销售部');
commit;

insert into emp values(seq_emp.nextval,'张三',1);
insert into emp values(seq_emp.nextval,'李四',1);
insert into emp values(seq_emp.nextval,'王五',2);
insert into emp values(seq_emp.nextval,'赵六',2);
insert into emp values(seq_emp.nextval,'孙七',3);
insert into emp values(seq_emp.nextval,'老八',3);
insert into emp values(seq_emp.nextval,'小九',3);
commit;
select * from dept;
select * from emp;




select * from emp where eid = 4

select * from dept where did = 2





insert int dept values(5,'行政部');

insert int emp values(10,'行政人员1',null);
insert int emp values(11,'行政人员1',null);

update emp set deptid = 5 where eid = 10;
update emp set deptid = 5 where eid = 11;












实体类

package entity;


import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


/*
 * hibernate实体类
 */
public class Dept implements Serializable {
  private Integer did;
  private String deptName;
  //增加关联集合属性(一对多)//在1的一方,表达持有多的一方的引用=》使用集合(一个部门有多个人员)(这个在一对多的时候用的。比如查找某个部门下的员工)
  private Set<Emp> empSet=new HashSet<Emp>() ;//查找某个员工在那个部门用不到这个(多对一)
  
 public Dept() {
	super();
	// TODO Auto-generated constructor stub
}
public Dept(Integer did, String deptName, Set<Emp> empSet) {
	super();
	this.did = did;
	this.deptName = deptName;
	this.empSet = empSet;
}
public Integer getDid() {
	return did;
}
public void setDid(Integer did) {
	this.did = did;
}
public String getDeptName() {
	return deptName;
}
public void setDeptName(String deptName) {
	this.deptName = deptName;
}
public Set<Emp> getEmpSet() {
	return empSet;
}
public void setEmpSet(Set<Emp> empSet) {
	this.empSet = empSet;
}
 
}


emp实体类

package entity;


import java.io.Serializable;


public class Emp implements Serializable {
  private Integer eid;
  private String empName;
  //private Dept dept; 外键,在这里不用这,直接管理另一个类的属性
  private Dept dept;//关联属性
  
  public Emp(){
	  
  }


public Emp(Integer eid, String empName, Dept dept) {
	super();
	this.eid = eid;
	this.empName = empName;
	this.dept = dept;
}


public Integer getEid() {
	return eid;
}


public void setEid(Integer eid) {
	this.eid = eid;
}


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



二:配置文件

<?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">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="dialect">org.hibernate.dialect.OracleDialect</property>
        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="connection.username">system</property>
        <property name="connection.password">password</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        <mapping resource="entity/Dept.hbm.xml"/><!-- 这个是写好Emp.hbm.xml配置文件后在写回来 -->
        <mapping resource="entity/Emp.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

三:配置实体类与表的映射文件(本次测试是:emp表与的dept表,emp表中引用了dept表的主键作为外键。测试可以通过查询emp表查找某个人员在哪个部门

 在emp表中设置一对多的映射关系。多个员工对应一个部门。 many—to-one  name是部门表的表名(多员工对应一个部门,哪个one后面就是要对应的一的那个部门表 class 也是部门表的实体类。注意那个column里写的是emp表中的外键)

<?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="entity.Emp" table="Emp">
<id name="eid"  >
<generator class="sequence">
<param name="sequence">seq_emp</param>
</generator>
</id>
<property name="empName"></property>
<!--配置多对一映射关系 -->                            <!-- emp表中的外键 -->
<many-to-one name="dept" class="entity.Dept" column="DEPTID"/> 
</class>

</hibernate-mapping>

dept表

<?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="entity.Dept" table="dept">
		<id name="did" column="did ">
			<generator class="sequence">
				<param name="sequence">
					seq_dept
				</param>
			</generator>
		</id>
	 <property name="deptName"></property>   <!-- 这个属性不要写错了是property -->
	</class>
		
</hibernate-mapping>

 测试类

package Test;

import org.hibernate.Session;

import entity.Emp;

import Util.HibernateUtil;

public class Test {
 public static void main(String[] args) {
	 Session session = HibernateUtil.currentSesion();
	 Emp emp=(Emp) session.load(Emp.class,4);
	 System.out.println(emp.getEmpName()+"所在部门为:"+emp.getDept().getDeptName());
	 
}
}