假設有一個User類,User對象的屬性包括編號,姓名,愛好(假設一我的有不少愛好,這時就要用到數組或者集合),用戶日誌(不少篇,也會用到數組或集合)。此時的實體Bean應該是幾個屬性和多個集合組成,以下:java
public class CollectionMapping implements Serializable {數據庫
// 私有對象數組
private Integer id;session
private String name;app
private String[] strValues;工具
private List<String> listValues = new ArrayList<String>();測試
private Set<String> setValues = new HashSet<String>();this
private Map<String,String> mapValues = new HashMap<String, String>();spa
// 封裝對象.net
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getStrValues() {
return strValues;
}
public void setStrValues(String[] strValues) {
this.strValues = strValues;
}
public List<String> getListValues() {
return listValues;
}
public void setListValues(List<String> listValues) {
this.listValues = listValues;
}
public Set<String> getSetValues() {
return setValues;
}
public void setSetValues(Set<String> setValues) {
this.setValues = setValues;
}
public Map<String, String> getMapValues() {
return mapValues;
}
public void setMapValues(Map<String, String> mapValues) {
this.mapValues = mapValues;
}
}
那麼,該實體Bean該怎樣配置關聯映射呢?這就涉及到了Hibernate關聯映射的集合映射,好比:數組的關聯映射,List的關聯映射,Map的關聯映射等。以上面的CollectionMapping類爲例,建立該類的實體關聯映射文件:CollectionMapping.hbm.Xml
<?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 package="com.cache.demo.entity">
<class name="CollectionMapping" table="t_collection">
<id name="id">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="name">
<column name="name"></column>
</property>
<!-- 配置數組關聯映射 -->
<array name="strValues" table="t_array">
<key column="aid"></key> <!-- 對應主表的id,也就是數據表t_collection的主鍵id值 -->
<list-index column="indexId"></list-index> <!-- 數組的索引值 -->
<element type="java.lang.String" column="realValue"></element> <!-- 在該數組表中存放的實際的值 -->
</array>
<!-- 配置List關聯映射 -->
<list name="listValues" table="t_list">
<key column="lid"></key>
<list-index column="indexId"></list-index>
<element type="java.lang.String" column="realValue"></element>
</list>
<!-- 配置Map關聯映射 -->
<map name="mapValues" table="t_map">
<key column="mid"></key>
<map-key type="java.lang.String" column="keyId"></map-key>
<element type="java.lang.String" column="realValue"></element>
</map>
<!-- 配置Set關聯映射 -->
<set name="setValues" table="t_set">
<key column="sid"></key>
<element type="java.lang.String" column="realValue"></element>
</set>
</class>
</hibernate-mapping>
在上面的配置文件中,每一個對應的對象都有本身專用的節點,例如:數組有<array>節點,List有<List>節點,Map有<map>節點,Set有<set>節點。下面來一一認識一下:
· <array> name屬性對應的是實體類中Array對象的引用名,table就是在數據庫中所對應的表, 子節點<key>對應自身從屬的主表的主鍵,即t_collection表的主鍵id;另外一個子節 點<element>對應的是該數組對象中存放的實際數據;<list-index>節點對應的是 該數據每條數據的索引值;
· <list> 與<array>相同;(略)
· <map> 與上面不一樣的是,map對象是以鍵-值對形式存在的,因此map中的索引也就是key 即<map-key>節點;
· <set> set數據類型因爲是無序的,因此set不存在索引,只有<key>和<element>兩個節點。
配置完成後,咱們用ExportDB工具類生成表,總共生成5張表:
· t_collection (主表)
· t_array
· t_list
· t_map
· t_set
以後,編寫測試類,爲實體類CollectionMapping 添加一條數據:
/**
* 向集合映射中添加一條數據
*/
public void addDataToCollection()
{
// 建立數組對象
String[] strArray = new String[3];
strArray[0]="cheng";
strArray[1]="zeng";
strArray[2]="zhang";
// 建立List對象
List<String> dataList = new ArrayList<String>();
dataList.add("s1");
dataList.add("s2");
dataList.add("y2");
// 建立Set對象
Set<String> dataSet = new HashSet<String>();
dataSet.add("Microsoft");
dataSet.add("Google");
dataSet.add("IBM");
// 建立Map對象
Map<String,String> dataMap = new HashMap<String, String>();
dataMap.put("America", "美國");
dataMap.put("China", "中國");
dataMap.put("Russia", "俄國");
// 建立CollectionMapping對象
CollectionMapping cm = new CollectionMapping();
// 設置CollectionMapping對象的值
cm.setName("個人大學");
cm.setListValues(dataList);
cm.setMapValues(dataMap);
cm.setSetValues(dataSet);
cm.setStrValues(strArray);
// 建立Session對象
Session session = HibernateSessionFactory.getSession();
// 執行添加操做
session.save(cm);
// 提交事務
session.beginTransaction().commit();
// 關閉事務
session.close();
}
這樣就爲CollectionMapping對象添加了一條數據。