Hibernate (分页,一对多,多对多,多对一)案例

来源:互联网 发布:mysql null的逻辑 编辑:程序博客网 时间:2024/05/20 19:47

    一对多:

Emp class:

public class Emp {    private Integer empno;    private String empname;    private Dept dept=new Dept();

Emp.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.onetomanydouble">    <class name="Emp" table="Emp" schema="happyy2164">        <id name="empno" column="empno">           <generator class="native"></generator>        </id>        <property name="empname" />        <!--多对一-->        <many-to-one  name="dept" column="deptno" class="Dept"></many-to-one>    </class></hibernate-mapping>
Dept class:
public class Dept {    private Integer deptno;    private String deptname;    private Set<Emp> emps=new HashSet<Emp>();
Dept.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.onetomanydouble">    <class name="Dept" table="Dept" schema="happyy2164">        <id name="deptno" column="deptno">            <generator class="native"></generator>        </id>        <property name="deptname" />        <!--植入一个set标签-->        <set name="emps" cascade="save-update" inverse="true" order-by="empname desc">            <!--多的一方表的外键列-->            <key column="deptno"></key>            <one-to-many class="Emp"></one-to-many>        </set>    </class></hibernate-mapping>
测试类:
 @Test    public void testOneToManyDouble(){        List<Dept> list = session.createQuery("from Dept").list();        for (Dept dept : list) {            System.out.println(dept.getDeptname());            System.out.println("======================");            for (cn.hb03mapping.onetomanydouble.Emp emp : dept.getEmps()) {                System.out.println(emp.getEmpname());            }        }    }
     多对多:

Project class:

public class Project {    private Integer proid;    private String proname;    //关联一个雇员的集合    private Set<Employee> employees = new HashSet<Employee>();
Project.hbm.xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.manytomany">    <class name="Project" table="Project" schema="happyy2164">        <id name="proid" column="proid">           <generator class="native"></generator>        </id>        <property name="proname" />        <!--table指的是中间表-->        <set name="employees" table="PROEMP" cascade="save-update" inverse="true">            <key column="RPROID"></key>            <many-to-many column="REMPID" class="Employee"></many-to-many>        </set>    </class></hibernate-mapping>
Employee class:

public class Employee {    private Integer empid;    private String empname;    //在员工的实体中植入一个项目的集合  一个员工可以参与N个工程    private Set<Project> projects = new HashSet<Project>();

Employee.hbm.xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.manytomany">    <class name="Employee" table="Employee" schema="happyy2164">        <id name="empid" column="empid">           <generator class="native"></generator>        </id>        <property name="empname" />        <!--table指的是中间表-->        <set name="projects" table="PROEMP">            <key column="REMPID"></key>            <many-to-many column="RPROID" class="Project"></many-to-many>        </set>    </class></hibernate-mapping>
测试类:

 @Test    public void addTest(){        //雇员对象        Employee emp1=new Employee();        emp1.setEmpname("张三8");        //雇员对象        Employee emp2=new Employee();        emp2.setEmpname("李四8");      //项目对象        Project pro1=new Project();        pro1.setProname("海淀花园8");        //项目一方,主的一方。        pro1.getEmployees().add(emp1);        pro1.getEmployees().add(emp2);        emp1.getProjects().add(pro1);        emp2.getProjects().add(pro1);        session.save(pro1);        session.save(emp1);        session.save(emp2);        tx.commit();    }
    多对一:

Dept class:

public class Dept {    private Integer deptno;    private String deptname;
Dept.hbm.xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.manytoone">    <class name="Dept" table="Dept" schema="happyy2164">        <id name="deptno" column="deptno">            <generator class="native"></generator>        </id>        <property name="deptname" />    </class></hibernate-mapping>
Emp class:

public class Emp {    private Integer empno;    private String empname;    //一个类的属性类型又是另外一个自定义类或者接口    private Dept dept=new Dept();
Emp.hbm.xml:

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="cn.hb03mapping.manytoone">    <class name="Emp" table="Emp" schema="happyy2164">        <id name="empno" column="empno">           <generator class="native"></generator>        </id>        <property name="empname" />        <!--多对一         员工是多的一方         name:Emp中植入一的一方的属性名称         column:数据库中的外键列的名称         class:属性的类型        -->        <many-to-one name="dept" column="deptno" class="Dept"></many-to-one>    </class></hibernate-mapping>
测试类:

@Test    public void testManyToOne(){        Emp emp = session.get(Emp.class, 1);        System.out.println(emp.getDept().getDeptname());    }

    分页:

@Test    //01.分页    public void testpagelist(){        String hql=" from Emp";        Query query = session.createQuery(hql);        int pageIndex=2;        int pageSize=3;        query.setFirstResult((pageIndex-1)*pageSize);        query.setMaxResults(pageSize);        List<Emp> list = query.list();        for (Emp emp: list) {           /* System.out.println(emp.getEname());*/        }

大配置:

<hibernate-configuration>    <session-factory>        <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>        <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>        <property name="connection.username">LJL</property>        <property name="connection.password">ljl19980427</property>        <!--<property name="connection.username">scott</property>        <property name="connection.password">tiger</property>-->        <!-- SQL dialect -->        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>        <property name="current_session_context_class">thread</property>        <property name="show_sql">true</property>        <!--<property name="hbm2ddl.auto">update</property>-->        <property name="connection.autocommit">true</property>        <!--   <mapping resource="cn/happy/entity/Dog.hbm.xml"/>           <mapping resource="cn/happy/entity/Doguuid.hbm.xml"/>-->        <!--  <mapping resource="cn/happy/hql/Dept.hbm.xml"/>          <mapping resource="cn/happy/hql/Emp.hbm.xml"/>-->        <!--<mapping resource="cn/happy/mapping/Emp.hbm.xml"/>        <mapping resource="cn/happy/mapping/Dept.hbm.xml"/>-->        <mapping resource="cn/happy/mapping/manytomany/Employee.hbm.xml"/>        <mapping resource="cn/happy/mapping/manytomany/Project.hbm.xml"/>    </session-factory></hibernate-configuration>

总结:

  cascade属性

     取值:

           None,save-update,delete和all

        none:当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值.

       save-update:当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。

       delete:当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。

当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。

       all:包含save-update,delete的行为。

级联也就是说当我们保存持久化对象A的时候自动帮我们保存持久化对象B。


问题:cascade属性写在什么位置?

解析:一对一或者多对一的时候,直接写在标签上,其他的写在set标签上。


set元素的inverse属性

inverse属性指定了关联关系中的方向。

inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false 。

注意:inverse决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-manymany-to-many有效(因 为只有这两种关联关系包含集合,而one-to-onemany-to-one只含有关系对方的一个引用)。


order-by:

Hibernate如何对集合中的元素进行排序

解析:由于使用Hibernate后,生成SQL重任交给了Hibernate,所以Hibernate给我们留了一条绿色通道,可以让我们很容易的对集合中的数据进行排序。那就是使用order-by,使用order-by用于在数据库中对集合进行排序。




原创粉丝点击