SSH学习 Hibernate 多对多
来源:互联网 发布:数据库与缓存保持一致 编辑:程序博客网 时间:2024/06/16 21:58
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 oraclepublic 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>
1 0
- SSH学习 Hibernate 多对多
- 【SSH】Hibernate学习(三)一对多、多对一、多对多
- SSH学习六 Hibernate 一对多 多对一的双向映射
- SSH学习四 Hibernate多对一的关系 + 增删改查
- hibernate学习之多对多
- 【SSH快速进阶】——Hibernate 多对多映射
- 【SSH系列】Hibernate映射 -- 多对多关联映射
- 【SSH系列】Hibernate映射-- 多对一单向关联映射
- SSH项目笔记:配置Hibernate多对一映射
- Hibernate学习笔记---------------多对多关系
- hibernate多对多关系学习
- SSH框架之Hibernate的关联映射之一对多、多对一映射
- Hibernate学习:单向多对一关联
- Hibernate学习之一对多关联
- Hibernate学习之一对多关联
- Hibernate学习笔记----单向多对一
- Hibernate学习笔记----双向多对一
- Hibernate学习之多对多映射
- Convert Sorted List to Binary Search Tree
- 在ubuntu中用apt-get安装LEMP栈(linux+nginx+mysql+php)
- 123
- poj 1077 八数码
- 色彩心理
- SSH学习 Hibernate 多对多
- 2015 多校第四场 XYZ and Drops
- cacti安装记录 第四阶段cacti的基本使用(2)Monitor插件的使用
- 机试算法讲解: 第9题 查找,对了,当然有哨兵
- poj 1274最大匹配匈牙利算法
- 【Github教程】史上最全github使用方法:github入门到精通
- JAVA学习的第三天
- android登陆界面的UI布局
- spring mvc配置文件