映射文件中配置集合屬性

配置Set(無序、不重複)屬性:

User對象對應的是兩張表,關係如下:


要說明的信息包括:

集合表的名稱——集合表  <set name... table...>

集合表的外鍵——集合外鍵  <key ...>

集合表的元素列——集合元素 <element...>

通過集合表的信息就可以想到集合表的結構,key不需要指定name,自動識別t_user表的主鍵作爲集合表的外鍵

package demo;

import java.util.Set;

public class User {
	private int id;
	private String name;
	private Set<String> addressSet;
	
	public Set<String> getAddressSet() {
		return addressSet;
	}
	public void setAddressSet(Set<String> addressSet) {
		this.addressSet = addressSet;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "id="+id+" name="+name;
	}
}

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 

  This mapping demonstrates 

     (1) a table-per-subclass mapping strategy
         
     (2) a simple component mapping
     
     (3) recursive associations withing an inheritance tree
     
-->

<hibernate-mapping 	package="demo">
	<!--
		name:類名
		table:表名
	-->
	<class name="User" table="t_user">
		
		<id name="id" type="int" column="id" >
			<generator class="native"/> <!--表示自動增長-->
		</id>
	
        <property name="name" type="string" column="name" />
		<!--addressSet屬性 Set集合-->
		<set name="addressSet" table="t_user_address">
			<key column="userId"></key>
			<element type="string" column="address"></element>
		</set>
	</class>
	

</hibernate-mapping>

public void testSave() throws Exception{
		Session session=sessionFactory.openSession();
		Transaction  tx=session.beginTransaction(); //開啓事務
		
		Set<String> set=new HashSet<String>();		
		set.add("中關村");
		set.add("科技園");
		set.add("1號");
		
		User  user=new User();
		user.setName("張三");
		user.setAddressSet(set);
		
		//保存
		session.save(user);
		
		tx.commit();//提交事務
		session.close();  //釋放資源,不一定是真正的關閉
	}

配置List(有序、可重複)屬性:

要說明的信息包括:

集合表的名稱——集合表  <set name... table...>

集合表的外鍵——集合外鍵  <key ...>

集合表的元素列——集合元素 <element...>

集合元素的索引列——<list-index ...>


<!--addressList屬性  List集合-->
		<list name="addressList" table="t_user_address">
			<key column="userId"></key>
			<list-index column="idx"></list-index>
			<element type="string" column="address"></element>
		</list>

配置數組屬性:

<!--addressList屬性  數組  與List映射一樣-->
		<array name="addressList" table="t_user_address">
			<key column="userId"></key>
			<list-index column="idx"></list-index>
			<element type="string" column="address"></element>
		</array>


配置Map(無序、不重複)屬性:

要說明的信息包括:

集合表的名稱——集合表  <map name... table...>

集合表的外鍵——集合外鍵  <key ...>

集合表的元素列——集合元素 <element...>

集合元素的鍵——< map-key ...>


<!--addressMap屬性 Map集合-->
		<map name="addressMap" table="t_user_addressMap">
			<key column="userId"></key>
			<map-key type="string" column="key_"></map-key>
			<element type="string" column="address"></element>
		</map>


配置Bag(Java中沒有)集合屬性:無序、可重複

<!--addressBag屬性  Bag集合:無序 可重複,與Set集合的映射基本一致-->
		<bag name="addressBag" table="t_user_addressBag">
			<key column="userId"></key>
			<element type="string" column="address"></element>
		</bag>


注意:

使用集合屬性時,一定要使用接口,而不能聲明爲具體的實現類。比如聲明爲Set,而不能是HashSet。

因爲經過Session操作後,集合就變成了Hibernate自己的集合實現類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章