Hibernate组件映射配置

当不需要将对象当做实例而是一个复合数据时可以使用组件映射配置

组件属性为对象

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表

组件集合元素表


从结果中可以看到集合无论是作为持久化实例还是组件元素 在数据库底层实现是一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值