1. Model(src/test/Person.java)
public class Person{
private Integer id;
private int age;
private Name name;//1. 组件属性name
private Map<String , Name> nicks = new HashMap<String , Name>(); //3.集合属性为组件
.............//setter和getter方法
}
2. 组件(src/test/Name.java)
public class Name{
private String first;
private String last;
private Person owner;//引用拥有该Name的Person对象
private Map<String ,Integer> power = new HashMap<String ,Integer>();//2. 组件属性为集合
public Name(){}
//初始化first、last属性的构造器
public Name(String first , String last){
this.first = first;
this.last = last;
}
.....//属性的setter和getter方法
}
3. 映射文件(src/test/hibernate.cfg.xml)
<?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">
<hibernate-mapping package="test">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<!-- 映射普通属性 -->
<property name="age" type="int"/>
<!-- 1. 映射组件属性name,组件属性的类型为Name -->
<component name="name"
class="Name" unique="true">
<!-- 指定owner属性代表容器实体 -->
<parent name="owner"/>
<!-- 映射组件属性的first属性 -->
<property name="first"/>
<!-- 映射组件属性的last属性 -->
<property name="last"/>
<!-- 2. 映射组件属性里的Map集合属性 -->
<map name="power" table="name_power">
<!-- 映射集合属性数据表的外键列 -->
<key column="person_name_id" not-null="true"/>
<!-- 映射集合属性数据表的Map key列 -->
<map-key column="name_aspect" type="string"/>
<!-- 映射保存集合元素的数据列 -->
<element column="name_power" type="int"/>
</map>
</component>
<!-- 3. 映射nicks集合属性,集合属性对应的数据表为nick_inf -->
<map name="nicks" table="nick_inf">
<!-- 映射集合属性数据表的外键列 -->
<key column="person_id" not-null="true"/>
<!-- 映射集合属性数据表的Map key列 -->
<map-key column="phase" type="string"/>
<!-- 映射保存集合里的组件元素 -->
<composite-element class="Name">
<!-- 指定owner属性代表容器实体 -->
<parent name="owner"/>
<!-- 映射组件属性的first属性 -->
<property name="first"/>
<!-- 映射组件属性的last属性 -->
<property name="last"/>
</composite-element>
</map>
</class>
</hibernate-mapping>
4. 测试类(工具类如上一篇博客)
public class PersonManager{
public static void main(String[] args){
PersonManager mgr = new PersonManager();
mgr.createAndStorePerson();
HibernateUtil.sessionFactory.close();
}
private void createAndStorePerson()
{
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//创建Person对象
Person yeeku = new Person();
//为Person对象设置属性
yeeku.setAge(29);
//1. 组件属性name
Name n = new Name("crazyit.org" , "疯狂Java联盟");
//2. 组件属性为集合
Map<String ,Integer> power = new HashMap<String ,Integer>();
power.put("运气" , 96);
power.put("智慧" , 98);
n.setPower(power);
yeeku.setName(n);
//3. 集合属性为组件
//创建一个Map集合
Map<String , Name> nicks = new HashMap<String , Name>();
nicks.put("幼年" , new Name("Wawa" , "Wawa"));
nicks.put("成年" , new Name("Yeeku" , "Lee"));
yeeku.setNicks(nicks);
session.save(yeeku);
tx.commit();
HibernateUtil.closeSession();
}
}