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

    一对多:

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用于在数据库中对集合进行排序。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值