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