文档章节

jpa级联删除(CascadeType.REMOVE)

zchuanzhao
 zchuanzhao
发布于 2015/09/29 23:12
字数 565
阅读 69
收藏 0
Garage.java
Java代码   收藏代码
  1. package com.hibernate.jpa.bean1;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import javax.persistence.CascadeType;
  5. import javax.persistence.Column;
  6. import javax.persistence.Entity;
  7. import javax.persistence.FetchType;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.Id;
  10. import javax.persistence.OneToMany;
  11. @Entity
  12. public class Garage {
  13.     /**
  14.      * many to one 多对一
  15.      */
  16.     private Integer gid;
  17.     private String garagenum;
  18.     private Set<Auto> autos = new HashSet<Auto>();
  19.     @Id @GeneratedValue
  20.     public Integer getGid() {
  21.         return gid;
  22.     }
  23.     public void setGid(Integer gid) {
  24.         this.gid = gid;
  25.     }
  26.     @Column (length=20)
  27.     public String getGaragenum() {
  28.         return garagenum;
  29.     }
  30.     public void setGaragenum(String garagenum) {
  31.         this.garagenum = garagenum;
  32.     }
  33.     @OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
  34.     public Set<Auto> getAutos() {
  35.         return autos;
  36.     }
  37.     public void setAutos(Set<Auto> autos) {
  38.         this.autos = autos;
  39.     }
  40.     public void addGarageAuto(Auto auto) {
  41.         auto.setGarage(this);
  42.         this.autos.add(auto);
  43.     }
  44. }
Auto.java
Java代码   收藏代码
  1. package com.hibernate.jpa.bean1;
  2. import javax.persistence.CascadeType;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. import javax.persistence.JoinColumn;
  7. import javax.persistence.ManyToOne;
  8. @Entity
  9. public class Auto {
  10.     /**
  11.      * one to many 一对多关联
  12.      */
  13.     private Integer autoId;
  14.     private String autotype;
  15.     private String autonum;
  16.     private Garage garage;
  17.     @Id @GeneratedValue
  18.     public Integer getAutoId() {
  19.         return autoId;
  20.     }
  21.     public void setAutoId(Integer autoId) {
  22.         this.autoId = autoId;
  23.     }
  24.     public String getAutotype() {
  25.         return autotype;
  26.     }
  27.     public void setAutotype(String autotype) {
  28.         this.autotype = autotype;
  29.     }
  30.     public String getAutonum() {
  31.         return autonum;
  32.     }
  33.     public void setAutonum(String autonum) {
  34.         this.autonum = autonum;
  35.     }
  36.     @ManyToOne()
  37.     @JoinColumn(name="garageid")
  38.     public Garage getGarage() {
  39.         return garage;
  40.     }
  41.     public void setGarage(Garage garage) {
  42.         this.garage = garage;
  43.     }
  44. }
持久化数据 mysql> select * from garage; +-----+-----------+ | gid | garagenum | +-----+-----------+ | 1 | room1 | | 2 | room2 | | 3 | room3 | +-----+-----------+   mysql> select * from auto; +--------+---------+----------+----------+ | autoId | autonum | autotype | garageid | +--------+---------+----------+----------+ | 1 | hk2222 | car | 1 | | 2 | bj0000 | car | 1 | | 3 | jn1d31 | bus | 3 | | 4 | sh3243 | car | 3 | +--------+---------+----------+----------+   junit测试方法delete()
Java代码   收藏代码
  1. @Test public void delete() {
  2.     EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
  3.     EntityManager em = factory.createEntityManager();
  4.     em.getTransaction().begin();
  5.     Garage garage = em.find(Garage.class3);
  6.     em.remove(garage);
  7.     em.getTransaction().commit();
  8.     em.close();
  9.     factory.close();
  10. }
调用delete方法是myeclipse控制台出现异常 javax.persistence.RollbackException: Error while commiting the transaction Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`itcast/auto`, CONSTRAINT `FK1F51CFA8A25FB2` FOREIGN KEY (`garageid`) REFERENCES `garage` (`gid`))   发出的sql语句是:
C#代码   收藏代码
  1. Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
  (二)在Garage.java中添加CascadeType.REMOVE注解
Java代码   收藏代码
  1. @OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE},mappedBy="garage")
  2. public Set<Auto> getAutos() {
  3.     return autos;
  4. }
此时再次调用junit单元测试的delete方法 测试显示成功,发出的sql语句为
Sql代码   收藏代码
  1. Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
  2. Hibernate: select autos0_.garageid as garageid1_, autos0_.autoId as autoId1_, autos0_.autoId as autoId0_0_, autos0_.autonum as autonum0_0_, autos0_.autotype as autotype0_0_, autos0_.garageid as garageid0_0_ from Auto autos0_ where autos0_.garageid=?
  3. Hibernate: delete from Auto where autoId=?
  4. Hibernate: delete from Auto where autoId=?
  5. Hibernate: delete from Garage where gid=?
      此时表garage中的gid为3的字段被全部删除,同时也级联删除了与garage相关联表auto中garageid为3的字段
Sql代码   收藏代码
  1. mysql> select * from garage;
  2. +-----+-----------+
  3. | gid | garagenum |
  4. +-----+-----------+
  5. |   1 | room1     |
  6. |   2 | room2     |
  7. +-----+-----------+
 
Sql代码   收藏代码
  1. mysql> select * from auto;
  2. +--------+---------+----------+----------+
  3. | autoId | autonum | autotype | garageid |
  4. +--------+---------+----------+----------+
  5. |      1 | hk2222  | car      |        1 |
  6. |      2 | bj0000  | car      |        1 |
  7. +--------+---------+----------+----------+
怎么样,这下级联删除也明白了吧?

© 著作权归作者所有

zchuanzhao

zchuanzhao

粉丝 51
博文 244
码字总数 145913
作品 1
福州
程序员
私信 提问
JPA级联保存时能否配置调用级联对象的指定save()方法

刚接触JPA,JPA的级联操作极大的方便了开发。 但是,对JPA的级联配置有疑问。 如果我自定义了级联对象的save()方法,或者delete()方法。如何通过配置使之替代JPA默认级联时调用的保存或者删除...

蛮大人
2011/11/26
1K
0
PageOffice如何显示/隐藏Word文档中的标尺

在线打开并使用Word文档时,我们经常会需要使用打开的Word文档中,顶部的标尺来设置页面的边距、对齐位置等。这一操作,可以通过工具栏中“视图”→“标尺”选项的是否勾选来决定是否显示标尺...

yert
2013/04/25
1K
0
关于Java Servlet的中文乱码

具体如下: 1.JSP里CHARSET要为GB2312 contentType="text/html;charset=GB2312" 2.SERVERLET类里要有 request.setCharacterEncoding(gb2312); 3.字符集的重新格式化 java.net.URLEncoder ja......

xiahuawuyu
2012/08/02
128
0
Java Web-Servlet

章节目录 什么是Servlet Servlet 、ServletContext、Servlet Container、web 容器之间的区别 Servlet、ServletConfig、GenericServlet、HttpServlet、自定义Servlet 之间的联系 HttpServlet ......

markfork
2018/06/14
0
0
[转]通俗易懂Tomcat中Servlet的生命周期,讲的非常详细

我在上一篇文章里详细的介绍了 HTTP协议工作的流程,其中最重要的就是如何理解HTTP请求头和HTTP响应头,现在在这里再来详细的说明Tomcat 容器(即Servlet 容器)到底是如何 管理Servlet的,S...

晨曦之光
2012/04/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部