Hibernate一对多与多对一关系映射

运用部门与员工之间的关系

部门(Department)中有三属性,设置get和set方法

       
   private int did;
	private String dname;
	private Set<Employee> emps;


员工(Employee)也有三个属性,分别生成get和set方法
private int eid;
	private String ename;
	private Department depart;


部门类的xml文件映射(Department.hbm.xml)

<class name="com.cao.po.Department" table="depart">
		<id name="did">
			<generator class="native" />
		</id>
		<property name="dname"/>
		<!-- 映射set集合,key标签用于指定多段外键列名,需要和多端配置的many-to-one标签的列名一致 -->
		<set name="emps">
			<key column="depart_ids"/>
			<!-- class属性用于指定集合内的类型,因为在类中定义用了泛型,所以此处也可不进行指定 -->
			<one-to-many class="com.cao.po.Employee"/>
		</set>
	</class>



员工类的xml文件映射配置(Employee.hbm.xml)


<class name="com.cao.po.Employee" table="emp">
		<id name="eid">
			<generator class="native" />
		</id>
		<property name="ename"/>
		
		<!-- 配置多对一关系,hibernate会根据name的值去实体类中找其定义的类型(此处Department depart),
			然后根据其类型找该类所对应的配置文件Department.hbm.xml,建立关系,
			默认的该列引用一端的id属性列作为外键值,如果想自己指定可以在标签里配置property-ref="指定的列";
		 -->
		<many-to-one name="depart" column="depart_id" />
	</class>



简单的添加操作

public static void add(){
		Session session = HibernateUtil.getSession();
		Transaction ts = HibernateUtil.getTs();
		
		Department depart = new Department();
		depart.setDname("depart1");
		
		Employee emp1 = new Employee();
		//emp和depart建立关系,如果不设置对应的外键值为空
		emp1.setEname("emp1");
		emp1.setDepart(depart);
		Employee emp2 = new Employee();
		emp2.setEname("emp2");
		emp2.setDepart(depart);
		
		//如果同时在一端也进行关系维护的话,会生成两天update语句,如果想取消一端的维护的话可以配置inverse属性
		Set<Employee> eset = new HashSet<Employee>();
		eset.add(emp1);
		eset.add(emp2);
		depart.setEmps(eset);
		
		/*
		 * 必须对部门实体进行保存,因为员工表对部门表进行了引用,
		 * 保存时间可以早于emp,也可晚于emp,但是要在commit之前
		 * 两种情况会生成不同的sql语句,当保存emp早于depart时,会生成3条insert语句和2条update语句,
		 * 两条update语句是更新emp表的外键,因为在保存emp时depart的id为空,当再保存depart时,因为
		 * emp为持久化对象,所以其对应的引用值也会改变
		 * 
		 * 当保存depart在emp之前是只生成3条insert语句
		 */
		session.save(depart);
		session.save(emp1);
		session.save(emp2);
		
		ts.commit();
		session.close();
	}




你可能感兴趣的:(sql,Hibernate,xml)