`

CascadeType.REMOVE

    博客分类:
  • java
 
阅读更多
/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.entity;

import javax.persistence.*;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.validator.constraints.NotBlank;

//JPA标识
@Entity
@Table(name = "t_task")
public class Task extends IdEntity {

	private String title;
	private String description;
	private User user;

	// JSR303 BeanValidator的校验规则
	@NotBlank
	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	// JPA 基于USER_ID列的多对一关系定义
	@ManyToOne(cascade = CascadeType.REMOVE)
	@JoinColumn(name = "user_id")
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}



@Test
    public void remove(){
        Task task = taskDao.findOne(1L);
        long userId = task.getUser().getId();
        //删除task时,user也被删除
        taskDao.delete(task);

       User user = userDao.findOne(userId);

        logger.debug("user is {}",user);

    }


16:45:51.071 [main] DEBUG com.repository.TaskDaoTest - user is null



如果反过来,删除User对象,User对象上并未绑定任何关联关系
     User user  = userDao.findOne(2L);

        //删除user
        userDao.delete(user);

        //加载关联的task
         Task task = taskDao.findOne(1L);

        //重新加载user
        user  = userDao.findOne(2L);


        logger.debug("task is {}",task);
         logger.debug("task.user is {}",task.getUser());
        logger.debug("user is {}",user);



结果是只删除了user对象 task对象未删除,task关联的user对象在事务未结束时还可以访问
16:54:00.962 [main] DEBUG com.repository.TaskDaoTest - task is com.entity.Task@2a79db08[title=Study PlayFramework 2.0,description=http://www.playframework.org/,user=com.entity.User@367970fa[loginName=user,name=Calvin,plainPassword=<null>,password=2488aa0c31c624687bd9928e0a5d29e7d1ed520b,salt=6d65d24122c30500,roles=user,registerDate=2012-06-04 02:00:00.0,id=2],id=1]

17:09:56.307 [main] DEBUG com.repository.TaskDaoTest - task.user is com.entity.User@c734212[loginName=user,name=Calvin,plainPassword=<null>

16:54:00.973 [main] DEBUG com.repository.TaskDaoTest - user is null



若改为 CascadeType.PERSIST 则未级联删除 输出
16:47:08.936 [main] DEBUG com.repository.TaskDaoTest - user is com.entity.User@3ef6551c[loginName=user,name=Calvin,plainPassword=<null>,password=2488aa0c31c624687bd9928e0a5d29e7d1ed520b,salt=6d65d24122c30500,roles=user,registerDate=2012-06-04 02:00:00.0,id=2]
分享到:
评论

相关推荐

    hibernate的_CascadeType属性说明

    CascadeType是hibernate中的枚举类型,定义了多种级联操作,包括REFRESH、PERSIST、REMOVE、MERGE、ALL等。 CascadeType.REFRESH: 级联刷新是指当多个用户同时操作一个实体时,为了确保用户获取的数据是实时的。...

    Hibernate cascade在不同关联关系中的具体表现

    例如,当我们删除一个实体时,如果设置为`CascadeType.ALL`或`CascadeType.REMOVE`,那么其对应的实体也会被删除。同时,`CascadeType.PERSIST`和`CascadeType.MERGE`则会在保存或更新主体对象时处理相关联的对象。 ...

    hibernate集合映射inverse和cascade详解.txt

    如果我们希望在删除`School`实体时,自动删除其所有关联的`Student`,可以设置`cascade=CascadeType.REMOVE`。这样,在调用`session.delete(school)`时,所有在`studentSet`中的学生也将被删除。 ### 总结 `...

    Hibernate的级联操作(增,删,该)

    当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。但是,需要注意的是,这种操作可能导致...

    Hibernate级联操作一对多demo

    - 例如,如果我们希望在删除父类实体时,也删除所有子类实体,可以这样设置:`cascade = CascadeType.REMOVE`。 3. **使用级联操作** - 当我们通过Hibernate的Session对象保存或更新父类实体时,配置了级联操作的...

    hibernate入门学习

    4. `CascadeType.REMOVE`:删除关联的对象。 5. `CascadeType.ALL`:包含所有上述操作。 在实际使用中,需谨慎处理级联操作,避免不必要的数据丢失或错误。 **五、实战演练** 在“hibernate1013”项目中,你可以...

    hibernate注释源程序

    3. **CascadeType.REMOVE**: 删除操作会删除关联的对象。 4. **CascadeType.ALL**: 包含以上所有操作。 5. **CascadeType.PERSIST**: 仅在持久化操作时影响关联对象。 ### 示例源程序 在`hsl`文件中,我们可以找到...

    Hibernate一对一唯一外键关联映射(双向关联)

    根据实际需求,可以选择其他级联类型,如`CascadeType.PERSIST`仅在保存时级联,`CascadeType.REMOVE`仅在删除时级联等。 五、实际应用与注意事项 在实际开发中,一对一关联常用于两个紧密相关的实体,如用户与用户...

    详解Hibernate cascade级联属性的CascadeType的用法

    当删除一个实体(`remove()`)时,如果该实体与其他实体有关联,并且使用了`CascadeType.REMOVE`,Hibernate会递归地删除所有关联的实体。这样可以确保在删除主对象时,与其相关联的对象也一同被删除,避免了数据不...

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

    例如,如果级联类型包括了`CascadeType.REMOVE`,那么删除一个用户将连同其所有帖子一起被删除,这可能不是我们期望的结果。 此外,为了优化性能,通常会配合使用`FetchType.LAZY`或`FetchType.EAGER`来控制关联的...

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

    JPA提供了一系列的级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果我们设置了`CascadeType.ALL`,当保存或删除一个`Student`时,JPA会自动保存或删除所有相关的`...

    jpa to many

    @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List&lt;ChildEntity&gt; children; } @Entity public class ChildEntity { @Id @GeneratedValue(strategy = ...

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

    JPA提供了多种级联类型,如`CascadeType.PERSIST`、`CascadeType.MERGE`、`CascadeType.REMOVE`等。例如,如果设置为`CascadeType.ALL`,那么当保存一个班级实体时,它所关联的所有学生实体也会被自动保存;同样,...

    hibernate_second2项目源码

    2. **级联类型**:Hibernate提供了多种级联类型,如`CascadeType.SAVE_UPDATE`、`CascadeType.REMOVE`等。在上述例子中,`CascadeType.ALL`意味着保存、更新和删除操作都会影响到关联的对象。 3. **级联操作的顺序*...

    hibernate中的注释的几种配置方式

    @Cascade(value={org.hibernate.annotations.CascadeType.MERGE, org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.REFRESH, org.hibernate.annotations.CascadeType.REMOVE}...

    Hibernate+Annotation.doc

    例如,`CascadeType.PERSIST`会将关联对象一起保存,`CascadeType.REMOVE`会在删除主体对象时删除关联对象等。`CascadeType.ALL`则表示所有操作都会级联。 9. **mappedBy**: `mappedBy`在双向一对多或多对一关系...

    hibernate常见异常针对于jpa

    - `CascadeType.REMOVE`: 当父实体被删除时,所有关联的子实体也将被删除。 - `CascadeType.REFRESH`: 当父实体被刷新时,所有关联的子实体也将被刷新。 - `CascadeType.ALL`: 同时执行上述所有操作。 #### 二、...

    实体Bean之间的级联关系

    若希望在删除一个实体时同时删除其关联实体,可以使用`CascadeType.REMOVE`。 需要注意的是,级联操作需要谨慎使用,因为过度的级联可能导致不必要的数据库操作,影响性能。此外,如果不正确地设置级联,可能会意外...

    hibernate注解

    常用的级联类型包括`CascadeType.SAVE_UPDATE`(保存或更新关联实体)、`CascadeType.PERSIST`(持久化新实体)和`CascadeType.REMOVE`(删除关联实体)。通过在实体关系映射的注解中指定这些级联类型,可以实现数据...

Global site tag (gtag.js) - Google Analytics