当不需要将对象当做实例而是一个复合数据时可以使用组件映射配置
组件属性为对象
public class Person
{
private int id;
private int age;
private Name name;
public Person(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", age=" + age + ", name.first=" + name.getFirst() + ",name.last="+name.getLast()+"]";
}
}
<?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="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="int"/>
<component name="name" class="Name" unique="true">
<parent name="owner"/>
<property name="first"/>
<property name="last"/>
</component>
</class>
</hibernate-mapping>
public class test1 {
Transaction tx=null;
public void ObjectComponentDemo(){
@Test
Session session=HibernateUtil.currentSession();
tx=session.beginTransaction();
Person person=new Person();
Name name=new Name();
name.setFirst("1");
name.setLast("1");
person.setName(name);
session.save(person);
tx.commit();
HibernateUtil.closeSession();
}
@Test
public void getInfo(){
Session session=HibernateUtil.currentSession();
tx=session.beginTransaction();
Person person=(Person) session.get(Person.class, 1);
System.out.println(person);
tx.commit();
HibernateUtil.closeSession();
}
}
可以看到name实体并没有当做实体建立一张表进行关联而是作为字段来表示对象的属性
组件属性为集合
当组件有集合属性的时候,peroson类无需更改。只需在name中增加集合属性,并且增加相应的映射配置即可
package entity;
import java.util.HashMap;
import java.util.Map;
public class Name {
private String first;
private String last;
private Person owner;
private Map<String,Integer> power=new HashMap<String,Integer>();
public Name(){}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
public Person getOwner() {
return owner;
}
public void setOwner(Person owner) {
this.owner = owner;
}
public Map<String, Integer> getPower() {
return power;
}
public void setPower(Map<String, Integer> power) {
this.power = power;
}
}
<?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="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="int"/>
<component name="name" class="Name" unique="true">
<parent name="owner"/>
<property name="first"/>
<property name="last"/>
<map name="power" table="name_power">
<key column="person_name_id" not-null="true"/>
<map-key column="name_aspect" type="java.lang.String"/>
<element column="name_power" type="java.lang.Integer"/>
</map>
</component>
</class>
</hibernate-mapping>
可以看到仅仅只是在组件的属性中加了个集合,在数据库的运行结果其实是和直接映射集合是一样的
集合属性的元素为组建
public class Person
{
private int id;
private int age;
private Map<String,Name> nicks=new HashMap<String,Name>();
public Person(){}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Map<String, Name> getNicks() {
return nicks;
}
public void setNicks(Map<String, Name> nicks) {
this.nicks = nicks;
}
}
这里map的value是一个对象所以用composite-element标签映射对象
<pre name="code" class="html"><?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="entity">
<class name="Person" table="person_inf">
<!-- 映射标识属性 -->
<id name="id" column="person_id">
<!-- 指定主键生成器策略 -->
<generator class="identity"/>
</id>
<property name="age" type="java.lang.Integer"/>
<map name="nicks" table="nick_inf">
<key column="person_id" not-null="true"/>
<map-key column="phase" type="java.lang.String"/>
<composite-element class="Name">
<parent name="owner"/>
<property name="first"/>
<property name="last"/>
</composite-element>
</map>
</class>
</hibernate-mapping>
测试类
@Test
public void MapComponentDemo(){
Session session=HibernateUtil.currentSession();
tx=session.beginTransaction();
Person person=new Person();
Name name=new Name();
name.setFirst("c");
name.setLast("zk");
Map<String,Name> nick=person.getNicks();
nick.put("成年",name);
person.setNicks(nick);
session.save(person);
tx.commit();
HibernateUtil.closeSession();
}
person表
组件集合元素表
从结果中可以看到集合无论是作为持久化实例还是组件元素 在数据库底层实现是一样的