`
sefcertyu
  • 浏览: 248920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jpa级联操作详解2--级联删除(CascadeType.REMOVE)

阅读更多

aad

Garage.java

package com.hibernate.jpa.bean1;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Garage {

	/**
	 * many to one 多对一
	 */
	private Integer gid;
	private String garagenum;
	private Set<Auto> autos = new HashSet<Auto>();
	
	@Id @GeneratedValue
	public Integer getGid() {
		return gid;
	}
	public void setGid(Integer gid) {
		this.gid = gid;
	}
	@Column(length=20)
	public String getGaragenum() {
		return garagenum;
	}
	public void setGaragenum(String garagenum) {
		this.garagenum = garagenum;
	}
	@OneToMany(cascade={CascadeType.PERSIST},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}
	public void setAutos(Set<Auto> autos) {
		this.autos = autos;
	}
	public void addGarageAuto(Auto auto) {
		auto.setGarage(this);
		this.autos.add(auto);
	}

}

Auto.java

package com.hibernate.jpa.bean1;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Auto {

	/**
	 * one to many 一对多关联
	 */
	private Integer autoId;
	private String autotype;
	private String autonum;
	private Garage garage;

	@Id @GeneratedValue
	public Integer getAutoId() {
		return autoId;
	}
	public void setAutoId(Integer autoId) {
		this.autoId = autoId;
	}
	public String getAutotype() {
		return autotype;
	}
	public void setAutotype(String autotype) {
		this.autotype = autotype;
	}
	public String getAutonum() {
		return autonum;
	}
	public void setAutonum(String autonum) {
		this.autonum = autonum;
	}
	@ManyToOne()
	@JoinColumn(name="garageid")
	public Garage getGarage() {
		return garage;
	}
	public void setGarage(Garage garage) {
		this.garage = garage;
	}

}

持久化数据

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()

	@Test public void delete() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Garage garage = em.find(Garage.class, 3);
		em.remove(garage);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

调用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语句是:

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
 

(二)在Garage.java中添加CascadeType.REMOVE注解

	@OneToMany(cascade={CascadeType.PERSIST,CascadeType.REMOVE},mappedBy="garage")
	public Set<Auto> getAutos() {
		return autos;
	}

此时再次调用junit单元测试的delete方法

测试显示成功,发出的sql语句为

Hibernate: select garage0_.gid as gid1_0_, garage0_.garagenum as garagenum1_0_ from Garage garage0_ where garage0_.gid=?
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=?
Hibernate: delete from Auto where autoId=?
Hibernate: delete from Auto where autoId=?
Hibernate: delete from Garage where gid=?
 

 

 

此时表garage中的gid为3的字段被全部删除,同时也级联删除了与garage相关联表auto中garageid为3的字段

mysql> select * from garage;
+-----+-----------+
| gid | garagenum |
+-----+-----------+
|   1 | room1     |
|   2 | room2     |
+-----+-----------+

 

mysql> select * from auto;
+--------+---------+----------+----------+
| autoId | autonum | autotype | garageid |
+--------+---------+----------+----------+
|      1 | hk2222  | car      |        1 |
|      2 | bj0000  | car      |        1 |
+--------+---------+----------+----------+

怎么样,这下级联删除也明白了吧?

 

分享到:
评论
4 楼 woodpeckerboy 2014-04-18  
是的我这边变也无法级联删除。多的一端的外键 参照一的一段的主键约束未解除。
3 楼 木南飘香 2011-02-24  
2 楼 cuiyujie 2010-03-16  
你好,
不用
# @Test public void delete() { 
#     EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-hibernate"); 
#     EntityManager em = factory.createEntityManager(); 
#     em.getTransaction().begin(); 
#     Garage garage = em.find(Garage.class, 3); 
#     em.remove(garage); 
#     em.getTransaction().commit(); 
#     em.close(); 
#     factory.close(); 
# }

怎么删除啊,我用的是继承的HibernateDaoSupport,调用getHibernateTemplate().delete(object);删除出错,怎么回事啊?请教谢谢!
1 楼 yoin528 2010-02-03  
jpa不是不支持级联删除么,我都@OneToMany(cascade=CascadeType.ALL)也没见能级联删除啊,还抛异常了。

相关推荐

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

    JPA中的一对多双向关联与级联操作

    级联操作是JPA提供的一种特性,允许开发者指定当一个实体被持久化、更新、删除时,其关联的实体应该如何处理。这可以通过`CascadeType`枚举在`@OneToMany`注解中设置。例如,如果我们希望当用户被删除时,所有相关的...

    10_传智播客JPA详解_JPA中的一对多双向关联与级联操作

    3. 级联操作详解:阐述各种级联类型的含义和使用场景,以及如何在实体上设置级联策略。 4. 示例代码解析:提供具体的代码示例,展示如何在实体类中定义关联,并进行增删改查操作。 5. 性能优化建议:讨论如何通过...

    spring jpa操作数据库 级联数据 hibernate

    本主题主要围绕"spring jpa操作数据库 级联数据 hibernate"展开,探讨如何利用Spring JPA进行数据库交互,并涉及到级联操作和与Hibernate的集成。 Spring JPA是Spring对Java Persistence API的一个封装,它提供了...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    2. **级联操作(Cascading)**: 级联操作允许在一个实体的操作(如保存、删除)影响到与其关联的其他实体。`CascadeType`枚举提供了多种级联类型。 3. **外键约束(Foreign Key Constraints)**: JPA支持声明外键...

    JPA基础语法资料--JPA_Basic

    JPA支持懒加载和级联操作,比如在上述用户和订单的例子中,可以通过设置`mappedBy`属性实现懒加载,而级联操作如`CascadeType.ALL`可以在操作用户时同时处理关联的订单。 9. **实体状态管理** JPA定义了四种实体...

    Hibernate 一对多、多对一、级联、加载、反转

    例如,如果我们设置级联类型为`CascadeType.ALL`,那么删除一个用户时,与之关联的所有订单也会被删除。这通过`@OneToMany`或`@ManyToOne`上的`cascade`属性实现。 4. **加载策略**:Hibernate提供了多种加载策略,...

    jpa--9.单向多对一

    - 如果希望在删除或更新Employee时,也影响到关联的Department,可以使用`@ManyToOne(cascade = CascadeType.ALL)`,指定级联操作类型。 6. **性能优化**: - 在处理大量数据时,考虑使用`@BatchSize`注解优化...

    spring-data-jpa-1.1.0.RELEASE

    6. 实体关系管理:包括懒加载、EAGER加载,以及级联操作(CascadeType)。 7. CRUD操作:提供了基本的创建(create)、读取(read)、更新(update)、删除(delete)操作,以及保存(save)操作,可以同时处理新增...

    jpa--10.单向一对多

    - **级联操作**:可以通过`cascade`属性设置级联操作,如`CascadeType.ALL`表示对一方实体的操作(如删除、保存等)会级联到多方实体。 - ** orphanRemoval**:如果希望当一方实体移除时,关联的多方实体也被自动...

    jpa--11.双向一多

    在`@OneToMany`注解中,我们使用了`cascade`属性,如`CascadeType.ALL`,这意味着对部门的操作(如保存、删除)会级联到相关的员工上。这使得我们可以一次性处理整个关联关系,简化了数据操作。 6. **性能考虑** ...

    实体Bean之间的级联关系

    实体Bean之间的级联关系是Java持久化框架如Hibernate或JPA中的一个重要概念,它涉及到对象关系映射(ORM)中的数据操作同步性。在数据库中,实体Bean通常代表表中的行,而实体间的级联关系则反映了表之间的关联。...

    JPA学习总结(三)--JPAOneToMany双向关联

    `cascade = CascadeType.ALL`意味着对User的操作(如保存、删除)会自动应用到其关联的Order对象。 而在子实体(多端)上,通常不需要额外的注解,因为关联已经被父实体定义了。但是,为了完成双向关联,我们需要在...

    传智播客JPA学习笔记.pdf

    在JPA中,一对多关系通过@OneToMany和@ManyToOne注解定义,级联操作如CascadeType.PERSIST、CascadeType.REMOVE允许在操作父对象时自动处理子对象的状态。 **11. JPA中的一对多延迟加载与关系维护(一对多关系:二...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    `CascadeType.ALL`意味着对父实体进行的操作(如保存、更新、删除)会级联到所有子实体。`CascadeType.MERGE`则表示仅在合并父实体时更新子实体。开发者需要根据业务需求来选择合适的级联类型,以避免不必要的数据...

    JPA注解说明 详解

    `fetch`定义加载策略,`cascade`定义级联操作,如保存、删除等是否影响关联的实体。 9. **@OneToOne, @OneToMany, @ManyToMany**:这三种注解分别用于定义一对一、一对多和多对多的关系映射,它们也包含fetch和...

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    例如,如果希望当删除学生时,自动删除所有关联的课程,可以在`@ManyToMany`上添加`cascade = CascadeType.REMOVE`。 ### 7. 性能优化 在处理大量关联时,需要考虑懒加载(Lazy Loading)和Eager加载(Eager ...

Global site tag (gtag.js) - Google Analytics