码迷,mamicode.com
首页 > Web开发 > 详细

SSH学习 Hibernate 多对多

时间:2015-07-31 01:23:06      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

Hibernate 多对多关系的处理,是把两个po类(持久化类)分别建表,这两个是要自己写po类和对应的映射文件,两个表的关系另外再建一张表,这个关系表不需要有对应的类,只需在映射文件写必要的标签即可


注明一点:fetch = "join"  

fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询; 
而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。 
如果你的关联对象是延迟加载的,它当然不会去查询关联对象。 
另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。

上面这段文字参考了:http://blog.csdn.net/silentjesse/article/details/1907942


以TEAM和EMP为例,步骤:

(1)写两个PO类,及对应的映射文件,记得在Hibernate的配置文件加入这两个配置文件

(2)选择两个po类中的一个,做修改,下面是Team和Team的配置文件 包含了CRUD的代码

package com.ehr.po;

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

import org.hibernate.Session;

import com.ehr.dao.HibernateUtil;

public class Team {
	private int teamid;
	private String nm;
	private Set<Emp>ses = new HashSet<Emp>();
	public int getTeamid() {
		return teamid;
	}
	public void setTeamid(int teamid) {
		this.teamid = teamid;
	}
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	public Set<Emp> getSes() {
		return ses;
	}
	public void setSes(Set<Emp> ses) {
		this.ses = ses;
	}
	
	public static void addR(){
		Session session = HibernateUtil.getSession();
		Team t = (Team)session.get(Team.class, 2);
		Emp e = (Emp) session.get(Emp.class, 1);
		t.getSes().add(e);
		e= (Emp)session.get(Emp.class, 3);
		t.getSes().add(e);
		session.beginTransaction().commit();
		session.close();
	}
	
	public static void delete(){
		Session session = HibernateUtil.getSession();
		Team t = (Team)session.get(Team.class, 2);
		Emp e = (Emp) session.get(Emp.class, 1);
		t.getSes().remove(e);
		session.beginTransaction().commit();
	}
	
	public static void getQuery(){
		Session session = HibernateUtil.getSession();
		Team t = (Team)session.get(Team.class, 2);
		for (Iterator iterator = t.getSes().iterator(); iterator.hasNext();) {
			Emp e = (Emp) iterator.next();
			System.out.println(e.getNm());
		}
	}
	
	public static void main(String[] args) {
		addR();//向关系表添加内容,其实就是先向Set添加数据 然后提交事务即可
		delete();
		getQuery();
	}
}

映射文件

<?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 
	package="com.ehr.po">
	<class name="Team" table="team" lazy="true">
	 	<id name="teamid" >
			<generator class="identity"/>
		</id>
		<property name="nm" />	 
		<set name="ses" fetch="join" table="emp_team_r">
			<!-- key是自己的作为外键属性 -->
			<key column="tid"/>  
			<!-- 参照的类以及外键 -->
			<many-to-many class="Emp" column="eid"  ></many-to-many>
			
		</set>		 
	</class>
	
</hibernate-mapping>

另外一个类:

package com.ehr.po;

public class Emp {
	private int empid;
	private String nm; // orcl oracle
	public int getEmpid() {
		return empid;
	}
	public void setEmpid(int empid) {
		this.empid = empid;
	}
	public String getNm() {
		return nm;
	}
	public void setNm(String nm) {
		this.nm = nm;
	}
	

}

<?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 
	package="com.ehr.po">
	<class name="Emp" table="emp" lazy="true">
	 	<id name="empid" >
			<generator class="identity"/>
		</id>
		<property name="nm" />	 		 
	</class>
	
</hibernate-mapping>


版权声明:本文为博主原创文章,未经博主允许不得转载。

SSH学习 Hibernate 多对多

标签:

原文地址:http://blog.csdn.net/u011026968/article/details/47159881

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!