多对多组件映射介绍

不使用多对多关联映射的原因是为了提高数据库的运行性能,所以采用componenet映射,这个componenet类随着主类的消失而消失,不需要建立单独的映射文件。只能由主类看到componenet的信息。

 

component在表中没有对应的oid,

可以关联其它持久化类

component不能单独持久化(不能单独保存)

生命周期依赖于主类的生命周期

 

 

eg:

package com.bjpowernode.hibernate;

import java.util.HashSet;
import java.util.Set;

public class Monkey {
    private Integer id;
    private String name;
    //是它身体的一部分
    private Set monkeyAndTeacher = new HashSet();
	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 Set getMonkeyAndTeacher() {
		return monkeyAndTeacher;
	}
	public void setMonkeyAndTeacher(Set monkeyAndTeacher) {
		this.monkeyAndTeacher = monkeyAndTeacher;
	}
}


 

package com.bjpowernode.hibernate;

public class MonkeyAndTeacher {
    private Monkey monkey;
    private Teacher teacher;
    private String gongfu ;
	public Monkey getMonkey() {
		return monkey;
	}
	public void setMonkey(Monkey monkey) {
		this.monkey = monkey;
	}
	public Teacher getTeacher() {
		return teacher;
	}
	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}
	public String getGongfu() {
		return gongfu;
	}
	public void setGongfu(String gongfu) {
		this.gongfu = gongfu;
	}
}


 

package com.bjpowernode.hibernate;

import java.util.HashSet;
import java.util.Set;

public class Teacher {
    private Integer id;
    private String name;
    private Set monkeyAndTeacher = new HashSet();
	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 Set getMonkeyAndTeacher() {
		return monkeyAndTeacher;
	}
	public void setMonkeyAndTeacher(Set monkeyAndTeacher) {
		this.monkeyAndTeacher = monkeyAndTeacher;
	}
}


 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Monkey" table="t_monkey">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="monkeyAndTeacher" table="t_monkey_teacher" lazy="true">
		   <key column="monkey_id"/>
	       <composite-element class="com.bjpowernode.hibernate.MonkeyAndTeacher">
	            <parent name="monkey"/>
	            <many-to-one name="teacher" not-null="true" column="teacher_id" class="com.bjpowernode.hibernate.Teacher"/>
	            <property name="gongfu" type="string" not-null="true"/>
	       </composite-element>
	    </set>
	</class>
</hibernate-mapping>


 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Teacher" table="t_teacher">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<set name="monkeyAndTeacher" table="t_monkey_teacher" lazy="true" inverse="true">
		   <key column="teacher_id"/>
	       <composite-element class="com.bjpowernode.hibernate.MonkeyAndTeacher">
	            <parent name="teacher"/>
	            <many-to-one name="monkey" not-null="true" column="monkey_id" class="com.bjpowernode.hibernate.Monkey"/>
	            <property name="gongfu" type="string" not-null="true"/>
	       </composite-element>
	    </set>
	</class>


 

package com.bjpowernode.hibernate;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import junit.framework.TestCase;
public class Many2ManyTest extends TestCase {
	public void testSave1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
		
			Teacher t1 = new Teacher();
			t1.setName("红孩儿");
			session.save(t1);
			
			Teacher t2 = new Teacher();
			t2.setName("二郎神");
			session.save(t2);
			
			Monkey m = new Monkey();
			m.setName("猴子一");
			session.save(m);
			
			
			MonkeyAndTeacher mt1=  new MonkeyAndTeacher();
			mt1.setTeacher(t1);
		    mt1.setGongfu("三位真火");
		    mt1.setMonkey(m);
		    
			
			MonkeyAndTeacher mt2=  new MonkeyAndTeacher();
			mt2.setTeacher(t2);
		    mt2.setGongfu("七十三变");
		    mt2.setMonkey(m);
		    
		    m.getMonkeyAndTeacher().add(mt1);
		    m.getMonkeyAndTeacher().add(mt2);
		    
		    session.save(m);
		
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}	
	
	public void testLoad1() {
		Session session = null;
		Monkey m = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
	        m = (Monkey)session.load(Monkey.class, 1);
			System.out.println(m.getName());
			for (Iterator iter=m.getMonkeyAndTeacher().iterator(); iter.hasNext();) {
				MonkeyAndTeacher role = (MonkeyAndTeacher)iter.next();
				Hibernate.initialize(role.getTeacher());
				//System.out.println(role.getName());
			}
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		System.out.println(m.getName());
		for(Iterator i = m.getMonkeyAndTeacher().iterator();i.hasNext();){
			MonkeyAndTeacher mt = (MonkeyAndTeacher)i.next();
			System.out.println(mt.getTeacher().getName());
			System.out.println("我的功夫是:"+ mt.getGongfu());
		}	
	}		
}


 

 

posted @ 2013-06-17 20:58  jlins  阅读(167)  评论(0编辑  收藏  举报