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-many或many-to-many有效(因 为只有这两种关联关系包含集合,而one-to-one和many-to-one只含有关系对方的一个引用)。
order-by:
Hibernate如何对集合中的元素进行排序
解析:由于使用Hibernate后,生成SQL的重任交给了Hibernate,所以Hibernate给我们留了一条绿色通道,可以让我们很容易的对集合中的数据进行排序。那就是使用order-by,使用order-by用于在数据库中对集合进行排序。
- Hibernate (分页,一对多,多对多,多对一)案例
- hibernate HQL 分页 关联查询(一对多单向,多对一 双向,多对多)
- hibernate 一对多与多对一
- hibernate一对多,多对一关联
- Hibernate映射----(一对多,多对一)
- Hibernate一对多(多对一)实例
- hibernate 多对一,一对多
- Hibernate一对多、多对一映射
- hibernate一对多,多对一问题
- Hibernate多对一与一对多
- hibernate 一对多/多对一
- 【hibernate】多对一,一对多关系
- Hibernate一对多及多对一
- Hibernate双向一对多(多对一)
- Hibernate-一对多和多对一
- Hibernate一对多,多对一
- Hibernate annotation 一对多,多对一
- hibernate中一对多(多对一)双向关联
- node * 和 node **的使用
- Java-排序算法之插入排序算法
- 流程控制
- 快速幂 取模
- poj 2429 GCD & LCM Inverse
- Hibernate (分页,一对多,多对多,多对一)案例
- BZOJ1218: [HNOI2003]激光炸弹
- 栈和队列的应用:迷宫问题
- AndroidStudio导入项目在 Building gradle project info 一直卡住
- 数组
- HttpSession详解
- JavaScript三种弹窗
- Java线程面试常见题
- U3D的Shader数据的来源