Hibernate一对多映射配置

PS、inverse与cascade区别

1、inverse表示是否反转控制,默认为false,表示不反转,由本类控制

      表现为一方添加时,由inverse="false"的类修改外键列。

     (执行update语句)

      (1)一对多时,一方类集合设inverse="false"(即默认),多方类many-to-one不可设置,默认为true

                     表示设置多方表中外键列的值。

      (2)多对多时,根据业务需求设其中一多方为false,另一方需为true,即只由false方添加外键关联于第三方表,true方不修改以避免添加重复报错。

                     表示在中间表中插入或删除记录。

2、cascade表示级联,默认为none,可设置为save-update,delete,all(即包括save-update以及delete)等

      当设置了cascade不为none的一方,添加、修改、删除类中包含集合时,会同步添加、修改、删除集合代表类(一对多)或第三方表(多对多)的

      对应关系。

    (执行delete、insert语句)


一、构建实体类

          构建Deparment类作为一方

public class Department {
	private Integer id;
	private String name;
<pre name="code" class="java" style="font-size: 13.3333px;">        //保存包含的多个多方
private Set<Employee> employees = new HashSet<Employee>(); //初始化Set集合,方便添加元素
//get、set方法@Overridepublic String toString() {return "Department [id=" + id + ", name=" + name + ", employees=" + employees + "]";}}

          构建Employee类作为多方 

public class Employee {
	private Integer id;
	private String name;
	private Department department;
        
       //get、set方法

	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", department=" + department + "]";
	}
}

       构建Department.hbm.xml映射文件

        

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-20 0:24:37 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="entity">
    <class name="Department" table="DEPARTMENT">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <set name="employees" inverse="false">
            <key>
                <column name="DEPARTMENTID" />
            </key>
            <one-to-many class="Employee" />
        </set>
    </class>
</hibernate-mapping>
       1、<set>         一方

               (1)、name:一方中保存多方的集合属性名

               (2)、inverse:设为false(默认),表示维护关系

               (3)、table:构建的第三方关系表名,适用于多对多,不需配置

       2、<key><column/></key>

               (1)、name:多方类对应的表中,表示本类的列名(外键列名)

               (2)、class:多方实体类名(全类名)


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-4-20 0:24:37 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping package="entity">
    <class name="Employee" table="EMPLOYEE">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <many-to-one name="department" class="Department" >
            <column name="DEPARTMENTID" />
        </many-to-one>
    </class>
</hibernate-mapping>

      1、<many-to-one>

               (1)、name:多方实体类中,保存对应一方实体的属性名

                (2)、class:一方实体类名(类全名)

        2、<column>

                (1)、name:表中关联一方表的外键列名

                               与一方中的<key><column name=""/></key>相同


二、构建测试类

@Test
	public void testSave() {
		Session session = DBManager.getSessionFactory().openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			
			Employee employee1 = new Employee();
			employee1.setName("A");
			
			Employee employee2 = new Employee();
			employee2.setName("B");
			
			Department department = new Department();
			department.setName("Dept");
			
			employee1.setDepartment(department);
			employee2.setDepartment(department);
			department.getEmployees().add(employee1);
			department.getEmployees().add(employee2);
			
			session.save(department);
			session.save(employee1);
			session.save(employee2);
			
			tx.commit();
		} catch (HibernateException e) {
			tx.rollback();
			e.printStackTrace();
		} finally{
			session.close();
		}
	}
          

            1、未设置casecade时,要同时保存一方及多方。且先保存一方(department),再保存多方(employee)。

            2、set的inverse设为true(many-to-one锁定为false),双方都不维护,所以保存多方前要先关联一方。

       PS、

            3、 Hibernate先执行所有insert语句,在事务提交时再根据inverse修改外键列

            4、set的inverse为flase,同时保存一、多方时:

                   (1) 先保存多方时,一方还未保存,无法关联外键列,所以先设外键列为null,再执行修改

                               update  多方表  set  其他属性=?, 外键列=? where id=?

                              而后一方表重复修改外键列                update  多方表  set 外键列=? where id=?

                   (2)先保存一方时,插入后只修改一次外键列     update  多方表  set 外键列=? where id=?

          

             

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值