Hibernate 一对多,多对多映射实例

来源:互联网 发布:net软件开发培训 编辑:程序博客网 时间:2024/05/17 21:55

Demo结构:
这里写图片描述

一对多:

院系实体类:

package com.Bean;import java.util.HashSet;import java.util.Set;/** * 院系表(dept)实体类 * @author liu * */public class Dept {    //院系ID   private  String DeptId;   //院系名称   private String DeptName;   //院系所有学生集合   private Set<Student> Students=new HashSet<Student>();   public Dept(){   }

学生实体类:

package com.Bean;/** * 学生实体类 * @author liu * */public class Student {     //学号    private String Sno;    //姓名    private String Sname;    //所在院系    private Dept dept;    public Student(){    }

院系映射xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-5-18 19:58:28 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.Bean.Dept" table="dept" >        <id name="DeptId" type="java.lang.String">            <column name="deptid" />            <generator class="assigned" />        </id>        <property name="DeptName" type="java.lang.String">              <column name="deptname"/>        </property>     <set name="Students" inverse="false" table="student" cascade="all">      <key>         <column  name="deptid" />      </key>      <one-to-many class="com.Bean.Student"/>     </set>    </class></hibernate-mapping>

学生映射xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-5-18 19:58:28 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.Bean.Student" table="student">        <id name="Sno" type="java.lang.String">            <column name="sno" />            <generator class="assigned" />        </id>        <property name="Sname" type="java.lang.String">        <column name="sname"/>        </property>      <many-to-one name="dept" class="com.Bean.Dept" fetch="select">        <column name="deptid" />        </many-to-one>     </class></hibernate-mapping>

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory >    <property name="connection.username">root</property>    <property name="connection.password">123456</property>    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8</property>    <property name="show_sql">true</property>    <property name="format_sql">true</property>    <property name="hbm2ddl.auto">create</property>     <mapping  resource="com/Bean/Dept.hbm.xml"/>     <mapping  resource="com/Bean/Student.hbm.xml"/>    </session-factory></hibernate-configuration>

Dao层:

package com.Dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import com.Bean.Dept;import com.Bean.Student;import com.Factory.HibernateSessionFactory;public class HibernateOne2ManyDao {    public  void insert(){        //方法1:不在配置文件中设置inverse属性         /*Dept d=new Dept();        d.setDeptId("1");        d.setDeptName("计科");        Student s=new Student();        s.setSno("003");        s.setSname("马可波罗");        s.setDept(d);*/        //方法2:在Dept.hbm.xml中设置student不维护关联关系        Dept d2=new Dept();        d2.setDeptId("1");        d2.setDeptName("计科");        Student s2=new Student();        s2.setSno("004");        s2.setSname("马可波罗2");        d2.getStudents().add(s2);        Session session=HibernateSessionFactory.getSession();        Transaction transaction=session.beginTransaction();        //session.save(d);        //session.save(s);        session.save(d2);        transaction.commit();    }    public static void query(){        String sql="from Dept";        Session session=HibernateSessionFactory.getSession();        Transaction tx=session.beginTransaction();        List li=session.createQuery(sql).list();        tx.commit();    }}

测试类:

package HibernateOne2Many;import com.Dao.HibernateOne2ManyDao;public class Test1 {  public static void main(String[] args) {     HibernateOne2ManyDao h=new HibernateOne2ManyDao();      h.insert();     // HibernateOne2ManyDao.query();}  }

总结:

1.在Hibernate.cfg.xml文件中的
hbm2ddl.auto属性为
create:创建表,若存在则删除后创建
update:更新表
2.inverse属性:指定那一方维持关联关系,默认是双方一起维护(实例中是院系方维护)
3.Lazy属性:Hibernate3的新特性–属性延迟加载,默认为false,设置为true时

多对多:

Plaer实体类:

package com.Bean;import java.util.HashSet;import java.util.Set;public class Player {  private String pid;  private String pname;  private Set<Role> roles=new HashSet<Role>();  public Player(){  }

Role实体类:

package com.Bean;import java.util.HashSet;import java.util.Set;public class Role {  private String rid;  private String rname;  private Set<Player> players=new HashSet<Player>();  public Role(){  }

Player配置文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-5-18 19:58:28 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.Bean.Player" table="player" >        <id name="pid" type="java.lang.String">            <column name="pid" />            <generator class="assigned" />        </id>        <property name="pname" type="java.lang.String">              <column name="pname"/>        </property>     <set name="roles"  table="role_player" cascade="all">      <key>         <column  name="pid" />      </key>      <many-to-many class="com.Bean.Role" column="rid"/>     </set>    </class></hibernate-mapping>

Role配置文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-5-18 19:58:28 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping>    <class name="com.Bean.Role" table="role" >        <id name="rid" type="java.lang.String">            <column name="rid" />            <generator class="assigned" />        </id>        <property name="rname" type="java.lang.String">              <column name="rname"/>        </property>     <set name="players"  table="role_palyer" cascade="all">      <key>         <column  name="rid" />      </key>      <many-to-many class="com.Bean.Player" column="pid"/>     </set>    </class></hibernate-mapping>

Hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration>    <session-factory >    <property name="connection.username">root</property>    <property name="connection.password">123456</property>    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=utf8</property>    <property name="show_sql">true</property>    <property name="format_sql">true</property>    <property name="hbm2ddl.auto">create</property>     <mapping  resource="com/Bean/Dept.hbm.xml"/>     <mapping  resource="com/Bean/Student.hbm.xml"/>    <mapping  resource="com/Bean/Player.hbm.xml"/>     <mapping  resource="com/Bean/Role.hbm.xml"/>     </session-factory></hibernate-configuration>

Dao层:

package com.Dao;import java.util.List;import org.hibernate.Session;import org.hibernate.Transaction;import com.Bean.Dept;import com.Bean.Player;import com.Bean.Role;import com.Bean.Student;import com.Factory.HibernateSessionFactory;public class HibernateOne2ManyDao {    public  void insert(){        //方法1:不在配置文件中设置inverse属性         /*Dept d=new Dept();        d.setDeptId("1");        d.setDeptName("计科");        Student s=new Student();        s.setSno("003");        s.setSname("马可波罗");        s.setDept(d);*/        //方法2:在Dept.hbm.xml中设置student不维护关联关系        Dept d2=new Dept();        d2.setDeptId("1");        d2.setDeptName("计科");        Student s2=new Student();        s2.setSno("004");        s2.setSname("马可波罗2");        d2.getStudents().add(s2);        Session session=HibernateSessionFactory.getSession();        Transaction transaction=session.beginTransaction();        //session.save(d);        //session.save(s);        session.save(d2);        transaction.commit();    }    public static void query(){        String sql="from Dept";        Session session=HibernateSessionFactory.getSession();        Transaction tx=session.beginTransaction();        List li=session.createQuery(sql).list();        tx.commit();    }    /**     * 多对多插入方法     */    public static void insertRole_Player(){        Session session=HibernateSessionFactory.getSession();        Transaction transaction=session.beginTransaction();          Player p1=new Player();          p1.setPid("1");          p1.setPname("C罗");          Player p2=new Player();          p2.setPid("2");          p2.setPname("姚明");          Player p3=new Player();          p3.setPid("3");          p3.setPname("科比");          Role r1=new Role();          r1.setRid("1");          r1.setRname("酱油");          r1.getPlayers().add(p1);          r1.getPlayers().add(p2);          Role r2=new Role();          r2.setRid("2");          r2.setRname("路人");          r2.getPlayers().add(p3);          r2.getPlayers().add(p2);          session.save(r1);          session.save(r2);        transaction.commit();        session.close();    }}

测试类:

package HibernateOne2Many;import com.Dao.HibernateOne2ManyDao;public class Test1 {  public static void main(String[] args) {    /* HibernateOne2ManyDao h=new HibernateOne2ManyDao();      h.insert();*/     // HibernateOne2ManyDao.query();      HibernateOne2ManyDao.insertRole_Player();}  }

控制台输出:

七月 01, 2017 10:36:24 上午 org.hibernate.tool.hbm2ddl.SchemaExport executeINFO: HHH000230: Schema export completeHibernate:     select        player_.pid,        player_.pname as pname2_1_     from        player player_     where        player_.pid=?Hibernate:     select        player_.pid,        player_.pname as pname2_1_     from        player player_     where        player_.pid=?Hibernate:     select        player_.pid,        player_.pname as pname2_1_     from        player player_     where        player_.pid=?Hibernate:     insert     into        role        (rname, rid)     values        (?, ?)Hibernate:     insert     into        player        (pname, pid)     values        (?, ?)Hibernate:     insert     into        player        (pname, pid)     values        (?, ?)Hibernate:     insert     into        role        (rname, rid)     values        (?, ?)Hibernate:     insert     into        player        (pname, pid)     values        (?, ?)Hibernate:     insert     into        role_palyer        (rid, pid)     values        (?, ?)Hibernate:     insert     into        role_palyer        (rid, pid)     values        (?, ?)Hibernate:     insert     into        role_palyer        (rid, pid)     values        (?, ?)Hibernate:     insert     into        role_palyer        (rid, pid)     values        (?, ?)