文档章节

Hibernate 级联属性

萧小蚁
 萧小蚁
发布于 2015/06/15 00:09
字数 1318
阅读 19
收藏 0
点赞 0
评论 0

级联状态

cascade(级联)

用来指定两个对象之间的操作联动关系。当主控方执行操作时,关联对象(被动方)是否同步执行同一操作。

常用可选值

none:所有情况下均不进行级联操作。这是默认值。

save-update: 在执行保存和更新时进行级联操作。

delete:在执行删除时进行级联操作。

all : 所有情况下均进行级联操作。

级联只对增、删、改起作用。

inverse="true"和cascade="all"同时使用:

级联delete操作可以正常进行, insert和update会级联操作,但不维护关联关系。

注意:如果inverse="true"和cascade="all"同时使用,为了在做insert和update操作时同样能够

进行级联操作,需要在被控端同时维护一对多和多对一两个关系。

package model;

import java.util.Set;

/**
 * @author sally
 * 双向的一对多或多对一 自身关联
 */
public class Category {

	private int id;
	private String name;
	//如果把Category看成是多的一端
	private Category parent;
	//如果把Category看成是少的一端,则需要对多的一端进行对象集合的引用
	private Set<Category> clist;
	
	public Category(){
		
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Category getParent() {
		return parent;
	}

	public void setParent(Category parent) {
		this.parent = parent;
	}

<?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>
	<!-- name属性指定类名(全限定名) table指明表名,不指明table数据默认的表名和实体名一致 -->
    <class name="model.Category" table="cate_tab">
    	<!-- type指明当前字段的类型    name对应实体中的属性名 -->
        <id type="integer" name="id">
        	<!-- 提供ID自增的策略  native会根据数据库自行判断 -->
            <generator class="native"/>
        </id>
        <property name="name" type="string"></property>
        <set name="clist" inverse="false" cascade="all">
        	<key column="parent_id"></key>
        	<!-- 配置一对多的关联映射 -->
        	<one-to-many class="model.Category"/>
        </set>
        <many-to-one name="parent" column="parent_id"></many-to-one>
        
    </class>	
</hibernate-mapping>

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<!-- 配置连接数据库的参数 -->
		<!-- 配置数据库的方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
		<!-- 数据库驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///2o2mzishen</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		 <property name="hibernate.show_sql">true</property>
		 <!-- 其它属性配置 -->
		<!-- 指明C3P0的提供者 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 连接池参数的配置 -->
		<property name="hibernate.c3p0.min_size">5</property> 
	    <property name="hibernate.c3p0.max_size">30</property> 
	    <property name="hibernate.c3p0.timeout">1800</property> 
	    <property name="hibernate.c3p0.max_statements">50</property>
	    
	    <!-- 打印SQL语句到控制台 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property> 
		<!-- 注册实体的对象关系映射文件 -->
		
		<mapping resource="model/Category.hbm.xml"/>
		
	</session-factory>
</hibernate-configuration>

package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static SessionFactory factory;
	static{
		factory=new Configuration().configure().buildSessionFactory();
	}
	public static SessionFactory getFactory(){
		return factory;
	}
	
	public static Session getSession(){
		return factory.openSession();
	}
	
	public static void close(Session session){
		if(session!=null){
			session.close();
		}
		
	}
	
}

package test;


import java.util.HashSet;
import java.util.Set;

import model.Category;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import util.HibernateUtils;

public class O2mTest {

	@Test
	public void createTable(){
		Configuration cfg=new Configuration().configure();
		SchemaExport se=new SchemaExport(cfg);
		se.create(true, true);
	}
	/**
	 * 先添加多的一端,再添加少的一端
	 */
	@Test
	public void save(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		//添加一级分类
		Category c1=new Category();
		c1.setName("计算机");
		session.save(c1);
		
		//添加二级分类
		Category c2=new Category();
		c2.setName("软件开发");
		c2.setParent(c2);
		session.save(c2);
		
		//添加二级分类
		Category c3=new Category();
		c3.setName("硬件维修");
		c3.setParent(c3);
		session.save(c3);
		
		ts.commit();
		HibernateUtils.close(session);
	}
	/**
	 * 先添加少的一端,再添加多的一端
	 */
	@Test
	public void save1(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		
		
		ts.commit();
		HibernateUtils.close(session);
	}
	/**
	 * Inverse = true,不指定cascade
    cascade的默认值为none, 当对一级分类进行保存操作时,二级分类什么都不做. 所以只保存了一级分类对象, 没有保存二级分类对象
	 */
	@Test
	public void save2(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		//添加一级分类
				Category c1=new Category();
				c1.setName("手机");
				
				//添加二级分类
				Category c2=new Category();
				c2.setName("小米");
				//添加二级分类
				Category c3=new Category();
				c3.setName("华为");
				
				Set<Category> c=new HashSet<>();
				c.add(c2);
				c.add(c3);
				c1.setClist(c);
				
				session.save(c1);
					
		ts.commit();
		HibernateUtils.close(session);
	}
	/**
	 * Inverse = true,cascade=all
    一级分类与二级分类对象,包扩外键[经过测试,发现外键没有成保存,值为null]都成功保存。
    
	 */
	@Test
	public void save4(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		//添加一级分类
				Category c1=new Category();
				c1.setName("手机");
				
				
				//添加二级分类
				Category c2=new Category();
				c2.setName("小米");
				//添加二级分类
				Category c3=new Category();
				c3.setName("华为");
				
				Set<Category> c=new HashSet<>();
				c.add(c2);
				c.add(c3);
				c1.setClist(c);
				
				session.save(c1);
					
		ts.commit();
		HibernateUtils.close(session);
	}
	
	/**
	 * Inverse = false,cascade=all
    一级分类与二级分类对象都能保存成功,包扩外键都成功保存。
    
	 */
	@Test
	public void save5(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		//添加一级分类
				Category c1=new Category();
				c1.setName("手机");
				
				
				//添加二级分类
				Category c2=new Category();
				c2.setName("小米");
				//添加二级分类
				Category c3=new Category();
				c3.setName("华为");
				
				Set<Category> c=new HashSet<>();
				c.add(c2);
				c.add(c3);
				c1.setClist(c);
				
				session.save(c1);
					
		ts.commit();
		HibernateUtils.close(session);
	}
	
	/**
	 * Inverse = false,不指定cascade=all
  报错。因为少的一端为主控方,负责维护关系,所以在插入少的一端对象后,会尝试修改并不存在的多的一端对象。  
	 */
	@Test
	public void save6(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		
		//添加一级分类
				Category c1=new Category();
				c1.setName("手机");
				
				
				//添加二级分类
				Category c2=new Category();
				c2.setName("小米");
				//添加二级分类
				Category c3=new Category();
				c3.setName("华为");
				
				Set<Category> c=new HashSet<>();
				c.add(c2);
				c.add(c3);
				c1.setClist(c);
				
				session.save(c1);
					
		ts.commit();
		HibernateUtils.close(session);
	}
	
	/**
	 * 
	 */
	@Test
	public void delete(){
		Session session=HibernateUtils.getSession();
		Transaction ts=session.beginTransaction();
		Category c=(Category)session.get(Category.class,7);
		session.delete(c);
		
		ts.commit();
		HibernateUtils.close(session);
	}
	
	
}


© 著作权归作者所有

共有 人打赏支持
萧小蚁

萧小蚁

粉丝 98
博文 279
码字总数 192339
作品 0
海淀
程序员
Hibernate级联之一对多和inverse解析

hibernate的级联可以说是hibernate最重要的部分,只有深入了解了级联的特性与用法,才能运用自如。   这次讨论一对多的情况,所以就使用博客项目的用户表和博客表作为示例,来一起学习hib...

宇的季节
2017/11/28
0
0
Hibernate中cascade作用

只有“关系标记”才有cascade属性; 一个操作因级联cascade可能触发多个关联操作。前一个操作叫“主控操作”,后一个操作叫“关联操作”。   cascade属性的可能值有   all: 所有情况下均...

_守望者_
2014/04/22
0
0
总结Hibernate中的几种关联映射的配置

1 单向多对一(多个A映射到一个B) 把A中的Integer B_id改成 B b,然后在A的映射文件中添加: <many-to-one name="b" class="B的类全名" column="foreign key所在的字段名称" not-null="true"...

猴亮屏
2015/03/18
0
0
Hibernate 级联和关系维护

1、Hibernate中的级联操作: 在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,就是级联,也就是说在操作当前实体时,针对当前实体的操作会影响到相应配置的关联实体,比如...

Winnie007
2015/08/28
96
0
Hibernate的casecade与inverse探究

Hibernate级联问题 1.级联是指两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作; 2.级联配置通过many-to-one的cascade属性实现; 3.cascad...

龍琪
2012/04/20
0
0
hibernate级联(cascade和inverse)

级联(Cascade),两个以上的设备通过某种方式连接起来,能起到扩容的效果就是级联。Hibernate级联(Cascade)是用来说明数据库中连个表之间的相互关系(一对一,一对多,多对多)中,当对主对象...

长平狐
2012/09/03
267
0
Hibernater学习笔记(四)

今天学习了hibernate的查询,创建的实体类如下 Customer.java(销售员信息) Salesperson.java(客户信息) 1.一对多映射配置 Customer.hbm.xml Salesperson.hbm.xml 配置完两个文件后,需要...

Mr_欢先生
2017/12/10
0
0
Java程序员从笨鸟到菜鸟之(五十四)细谈Hibernate(五)Hibernate一对多关系映射

前几篇系列博客: 细谈Hibernate(一)hibernate基本概念和体系结构 细谈Hibernate(二)开发第一个hibernate基本详解 细谈Hibernate(三)Hibernate常用API详解及源码分析 细谈Hibernate(四...

长平狐
2012/11/12
425
0
hibernate关联关系的整理

hibernate关联关系的整理 1、关联关系映射的步骤 1.1关联关系的搭建 ---建表 ---建实体 1.2映射关联关系 1.3使用测试 2、映射关联关系 1:1 双向 单向 主表方: //关系属性 主表方: //mapped...

优惠券发放
04/18
0
0
org.hibernate.TransientObjectException

在用SSH做程序的时候,我要在数据库的外键表里插入数据,可是它总提示org.hibernate.TransientObjectException,说主键id不可以插入到外键表中。数据库里也是没有插入进信息的,谁能告诉我这个...

土鳖的弟弟
2014/03/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

pbgo: 基于Protobuf的迷你RPC/REST框架

https://www.oschina.net/p/pbgo

chai2010
29分钟前
0
0
rsync工具介绍、常用选项以及通过ssh同步

linux下的文件同步工具 rsync rsync是非常实用的一个同步工具,可以从a机器到b机器传输一个文件,也可以备份数据,系统默认没有这个工具,要使用命令 yum install -y rsync 安装。 rsync的命...

黄昏残影
44分钟前
0
0
OSChina 周四乱弹 —— 表妹要嫁人 舅妈叮嘱……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @哈哈哈哈哈嗝:一定要听——The Pancakes的单曲《咁咁咁》 《咁咁咁》- The Pancakes 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :...

小小编辑
今天
194
4
流利阅读笔记30-20180719待学习

重磅:让人类得老年痴呆的竟是它? Lala 2018-07-19 1.今日导读 去年奥斯卡最佳动画长片《寻梦环游记》里有一句经典台词:“比死亡更可怕的,是遗忘”。在电影中,年迈的曾祖母会重复说一样的...

aibinxiao
今天
3
0
1.16 Linux机器相互登录

Linux机器之间以密码方式互相登录 运行命令#ssh [ip address],标准命令:#ssh [username]@ip, 如果没有写用户名,则默认为系统当前登录的用户 命令#w查看系统负载,可查看到连接到该主机的...

小丑鱼00
今天
0
0
about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部