假设有一个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对象添加了一条数据。