hibernate关联映射有关属性

问题:如何实现添加部门的同时自动添加员工?

 cascade属性

解析:可以使用cascade(级联)方式

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。

核心代码:

在一对多的Dept.hbm.xml的配置文件中添加添加Cascade属性即可。

<?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.day04mapping.onetomany.entity">
<!--表名称-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
<!--植入set 标签 save-update 保存数据 -->
<set name="emps" cascade="save-update">
<!--多的一方表的外键列-->
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
</class>
</hibernate-mapping>

测试类
//save-update 级联保存数据
@Test
public void test(){
//读取大配置文件
Configuration cfg=new Configuration().configure();
//session工厂
SessionFactory factory=cfg.buildSessionFactory();
//session对象
Session session = factory.openSession();
//开启事务
Transaction transaction = session.beginTransaction();
Dept dept=new Dept();
dept.setDeptname("市场部");

Emp emp=new Emp();
emp.setEname("微热的翔");

emp.setDept(dept);
dept.getEmps().add(emp);

session.save(dept);
//提交事务
transaction.commit();
}



效果图:

我们可以从sql语句中可以看出,前二个sql语句已经实现了添加了同时添加员工和部门。第三个update语句很明显是冗余的,我们应当怎么解决这个问题了?

解析:我们可以利用hibernate关联关系的inverse属性

 set元素的inverse属性

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

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

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

核心代码:

<?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.day04mapping.onetomany.entity">
<!--表名称-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
<!--植入set 标签 save-update 保存数据 inverse 消除多余的update语句-->
<set name="emps" cascade="save-update" inverse="true">
<!--多的一方表的外键列-->
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
</class>
</hibernate-mapping>


当把inverse设置为true时的效果图。

order-by

在hibernate中怎么对数据进行排序了?
解析:由于hibernate框架将书写sql的重任交给了hibernate,所以Hibernate给我们留了一条绿色通道,可以让我们很容易的对集合中的数据进行排序。那就是使用order-by,使用order-by用于在数据库中对集合进行排序。

 核心代码:

<?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.day04mapping.onetomany.entity">
<!--表名称-->
<class name="Dept" table="DEPT" schema="root">
<!--列名-->
<id name="deptid" column="DEPTID">
<!--主键生成的策略 native:自动生成主键字段-->
<generator class="native"></generator>
</id>
<property name="deptname" column="DEPTNAME"></property>
<!--植入set 标签 save-update 保存数据 inverse 消除多余的update语句-->
<set name="emps" cascade="save-update" inverse="true" order-by="empno desc">
<!--多的一方表的外键列-->
<key column="deptno"></key>
<one-to-many class="Emp"></one-to-many>
</set>
</class>
</hibernate-mapping>




测试类
@Test
public void test02(){
Session session = HibernateUtil.getSession();
Dept dept = session.get(Dept.class, 24);
for (Emp item :dept.getEmps()){
System.out.println(item.getEname());
}
}



效果图


 




原文地址:https://www.cnblogs.com/sujulin/p/8136272.html