hibernate属性设置cascade和inverse

cascade是级联操作,使得在操作一端数据时,可以级联操作被关联的另一端的数据。

在多对一的关系中,多的一端不能操作级联为delete。一般在多的一端设为save-update。

在一对多的关系中,如果一的一端设置为delete时,多的一端不能指明外键为非空。

示例:

Student类

public class Student {
	private int id;
	private String name;
	private int age;
	private Grade grade;
	//省略get/set方法
}
Grade类

public class Grade {
	private int id;
	private String name;
	private Set<Student> students=new HashSet<Student>();
	//省略get/set
}
Student.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo">
	<class name="Student">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" />
		<property name="age" />
		<!-- cascade 级联,让操作级联到子实体 
			 save-update:保存和更新多的一端数据时,一的一端的数据可以一起保存和更新
			 none:不级联 
			 delete:删除级联,不能在多的一端使用 
			 all:表示所有操作都级联 -->
		<many-to-one name="grade" class="Grade" column="grade_Id" cascade="save-update"/>
	</class>
</hibernate-mapping>
Grade.hbm.xml配置文件

<hibernate-mapping package="com.test.pojo">
	<class name="Grade">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" />
		<!-- set是Grade中的集合属性 name属性名称 -->
		<set name="students" >
		  <!-- key表示外键 column表示外键列名 -->
		  <key column="grade_Id"/>
		  <!-- 一对多  类Grade中students所表示类型 -->
		  <one-to-many class="Student" />
		</set>
	</class>
</hibernate-mapping>
测试类

public class HibernateTest {
	@Test
	public void testCreateDB(){
		Configuration cfg=new Configuration().configure();
		SchemaExport se=new SchemaExport(cfg);
		//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
		se.create(true, true);
	}
	/**
	 * 保存数据
	 */
	@Test
	public void TestSave(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			
			Grade grade=new Grade();
			grade.setName("大一");
			
			Student stu=new Student();
			stu.setName("王五");
			stu.setAge(20);
			stu.setGrade(grade);
			
			Student stu1=new Student();
			stu1.setName("李四");
			stu1.setAge(20);
			stu1.setGrade(grade);

			session.save(stu);
			session.save(stu1);
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}
}

具体操作结果在此就不做详细介绍了,感兴趣的可以自己测试下。


============================================================================

接下来我们来看下inverse

inverse设置关系维护方。当inverse="false"时,谁管理谁维护。如果都管理了,那么都维护。当关系由多的一方来维护时,效率高。当关系由一的一方来维护时,会执行update语句。

示例:

Student.hbm.xml配置

<hibernate-mapping package="com.test.pojo">
	<class name="Student">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" />
		<property name="age" />
		<many-to-one name="grade" class="Grade" column="grade_Id"/>
	</class>
</hibernate-mapping>


Grade.hbm.xml配置

<hibernate-mapping package="com.test.pojo">
	<class name="Grade">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" />
		<!-- set是Grade中的集合属性 name属性名称 -->
		<!-- inverse设置由谁来管理关联关系,如果为false则双方都可以管理 -->
		<set name="students" inverse="false">
		  <!-- key表示外键 column表示外键列名 -->
		  <key column="grade_Id"/>
		  <!-- 一对多  类Grade中students所表示类型 -->
		  <one-to-many class="Student" />
		</set>
	</class>
</hibernate-mapping>
对应关系由多的一方来维护的测试类代码

@Test
	public void TestSave(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			
			Grade grade=new Grade();
			grade.setName("大一");
			
			Student stu=new Student();
			stu.setName("王五");
			stu.setAge(20);
			stu.setGrade(grade);
			
			Student stu1=new Student();
			stu1.setName("李四");
			stu1.setAge(20);
			stu1.setGrade(grade);
			
//			grade.getStudents().add(stu);
//			grade.getStudents().add(stu1);
			session.save(grade);
			session.save(stu);
			session.save(stu1);
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}

执行结果如下:


对应关系由一的一端来维护测试代码

@Test
	public void TestSave(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			
			Grade grade=new Grade();
			grade.setName("大一");
			
			Student stu=new Student();
			stu.setName("王五");
			stu.setAge(20);
//			stu.setGrade(grade);
			
			Student stu1=new Student();
			stu1.setName("李四");
			stu1.setAge(20);
//			stu1.setGrade(grade);
			
			grade.getStudents().add(stu);
			grade.getStudents().add(stu1);
			session.save(grade);
			session.save(stu);
			session.save(stu1);
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}
执行结果如下:

                                   
对应关系既有多的一方又有一的一方同时维护测试代码如下:

@Test
	public void TestSave(){
		Session session=null;
		Transaction tx=null;
		try{
			session=HibernateUtil.getSession();
			tx=session.beginTransaction();
			
			Grade grade=new Grade();
			grade.setName("大一");
			
			Student stu=new Student();
			stu.setName("王五");
			stu.setAge(20);
			stu.setGrade(grade);
			
			Student stu1=new Student();
			stu1.setName("李四");
			stu1.setAge(20);
			stu1.setGrade(grade);
			
			grade.getStudents().add(stu);
			grade.getStudents().add(stu1);
			session.save(grade);
			session.save(stu);
			session.save(stu1);
			tx.commit();
		}catch(Exception e){
			if(tx!=null)
				tx.rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}

执行结果如下:

                                                    

inverse="true"时,关系由另一端管理。不管一的一端是否指明关系,一的一端都不会去维护关系。建议inverse="true"。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值