hibernate复习(三)

关联映射(hibernate映射)

1. 集合映射

    实体类

public class User {

	private int userId;
	private String userName;

	// 一个用户,对应的多个地址
	private Set<String> address;

	private List<String> addressList = new ArrayList<String>(); 

	private Map<String,String> addressMap = new HashMap<String, String>();
	
    //.....
}

映射文件

<?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.itcast.a_collection">
	
	<class name="User" table="t_user">
		<id name="userId" column="id">
			<generator class="native"></generator>
		</id>	
		<property name="userName"></property>
		
		<!-- 
			set集合属性的映射
				name 指定要映射的set集合的属性
				table 集合属性要映射到的表
				key  指定集合表(t_address)的外键字段
				element 指定集合表的其他字段
					type 元素类型,一定要指定
		 -->
		 <set name="address" table="t_address">
		 	<key column="uid"></key>
		 	<element column="address" type="string"></element>
		 </set>
		 
		 <!-- 
		 	list集合映射
		 		list-index  指定的是排序列的名称 (因为要保证list集合的有序)
		  -->
		  <list name="addressList" table="t_addressList">
		  	  <key column="uid"></key>
		  	  <list-index column="idx"></list-index>
		  	  <element column="address" type="string"></element>
		  </list>
		  
		  <!-- 
		  	map集合的映射
		  		key  指定外键字段
		  		map-key 指定map的key 
		  		element  指定map的value
		   -->
		  <map name="addressMap" table="t_addressMap">
		  	<key column="uid"></key>
		  	<map-key column="shortName" type="string" ></map-key>
		  	<element column="address" type="string" ></element>
		  </map>
		  
		 
	</class>
	

</hibernate-mapping>

2. 一对多与多对一映射 (重点)

 以部门员工为例

1) 先写实体类

public class Dept {

	private int deptId;
	private String deptName;

	// 【一对多】 部门对应的多个员工
	private Set<Employee> emps = new HashSet<Employee>();

    //.....
}
	
public class Employee {

	private int empId;
	private String empName;
	private double salary;

	// 【多对一】员工与部门
	private Dept dept;

    //.....
}

2) 映射文件

<?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.itcast.b_one2Many">
	
	<class name="Dept" table="t_dept">
		<id name="deptId">
			<generator class="native"></generator>
		</id>	
		<property name="deptName" length="20"></property>
		
		<!-- 
			一对多关联映射配置  (通过部门管理到员工)
			Dept 映射关键点:
			1.  指定 映射的集合属性: "emps"
			2.  集合属性对应的集合表: "t_employee"
			3.  集合表的外键字段   "t_employee. dept_id"
			4.  集合元素的类型
			
			inverse=false  set集合映射的默认值; 表示有控制权
		 -->
		 <set name="emps" cascade="save-update,delete" table="t_employee" inverse="true">   <!-- table="t_employee" -->
		 	 <key column="dept_id"></key>
		 	 <one-to-many class="Employee"/>
		 </set>
		 
		 
	</class>
	

</hibernate-mapping>
<?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.itcast.b_one2Many">
	
	<class name="Employee" table="t_employee">
		<id name="empId">
			<generator class="native"></generator>
		</id>	
		<property name="empName" length="20"></property>
		<property name="salary" type="double"></property>
		
		<!-- 
			多对一映射配置
			Employee 映射关键点:
			1.  映射的部门属性  :  dept
			2.  映射的部门属性,对应的外键字段: dept_id
			3.  部门的类型
		 -->
		 <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>

	</class>
</hibernate-mapping>

3.Inverse属性

Inverse属性,是在维护关联关系的时候起作用的。

             表示控制权是否转移。(在一的一方起作用)

 

Inverse   控制反转。

Inverse = false  不反转;   当前方有控制权

True  控制反转; 当前方没有控制权

维护关联关系中,是否设置inverse属性:

1. 保存数据

有影响。

   如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL

2. 获取数据

无。

3. 解除关联关系?

有影响。

inverse=false,  可以解除关联

inverse=true,  当前方(部门)没有控制权,不能解除关联关系

(不会生成update语句,也不会报错)

4. 删除数据对关联关系的影响?

有影响。

inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据。

inverse=true,  没有控制权: 如果删除的记录有被外键引用,会报错,违反主外键引用约束!  如果删除的记录没有被引用,可以直接删除。

猜你喜欢

转载自blog.csdn.net/quge_name_harder/article/details/86565009