标签:
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>
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011026968/article/details/47159881