博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate用JPA注解 CascadeType.REMOVE 不起作用的解决办法
阅读量:7246 次
发布时间:2019-06-29

本文共 2516 字,大约阅读时间需要 8 分钟。

User类:  1 import java.io.Serializable; 2 import java.util.List; 3  4 import javax.persistence.CascadeType; 5 import javax.persistence.Entity; 6 import javax.persistence.GeneratedValue; 7 import javax.persistence.GenerationType; 8 import javax.persistence.Id; 9 import javax.persistence.OneToMany;10 import javax.persistence.Table;11 12 import com.fasterxml.jackson.annotation.JsonIgnore;13 @Entity14 @Table(name="user")15 public class User implements Serializable {16     17     private static final long serialVersionUID = 1L;18     @Id19     @GeneratedValue(strategy=GenerationType.IDENTITY)20     private Integer id;21     private String name;22     private String pass;23     private String email;24     private String photo;25   34     35     @JsonIgnore36     @OneToMany(targetEntity=Ticket.class,mappedBy="user",cascade = { CascadeType.REMOVE})37     private List
tickets;38 注意上面用的是javax.persistence.CascadeType;不是hibernate自己的注解。所以,CascadeType.REMOVE也是jpa的, entityManager.remove();session.delete();hibernate的删除用的是delete,没有remove。但是, hibernate可以说是jpa的一种实现,这个级联删除的注解在delete方法中也是可以起到作用的。
Ticket类: 1 import java.io.Serializable; 2 14 15 @Entity16 @Table(name="ticket")17 public class Ticket implements Serializable{18     private static final long serialVersionUID = 1L;19     @Id20     @GeneratedValue(strategy=GenerationType.IDENTITY)21     private Integer id;22     private String name;23     private String type;24     private Float price;25     26     27     @JsonIgnore28     @ManyToOne(targetEntity=User.class)29     @JoinColumn(name="userId",referencedColumnName="id")30     private User user;31
提供两个删除操作,第一个是根据持久化实体删除,这个参数user必须要持久化的才有用。第二个是根据id删除实体。  实验发现,CascadeType.REMOVE注解对第一个删除操作是起作用的,对第二个不起作用!!!
前者  1     @Override 2     public void delete(User entity) { 3         getSF().beginTransaction(); 4         User user = (User) getSF().get(User.class, entity.getId()); 5         getSF().delete(user); 6         getSF().getTransaction().commit(); 7     } 8  9     @Override10     public void delete(Class
clazz, Serializable id) {11 String name = clazz.getSimpleName();//User12 String hql = "delete " + name + " en where en.id = ?1";13 getSF().beginTransaction();14 getSF().createQuery(hql).setParameter("1", id).executeUpdate();15 getSF().getTransaction().commit();16 }

结论:hibernate使用JPA注解CascadeType.REMOVE时,对根据持久化实体来删除实体的操作是起作用的,能起到级联删除的效果;对根据id来删除实体的删除操作是不起作用的!!!

转载于:https://www.cnblogs.com/chenhtblog/p/8065647.html

你可能感兴趣的文章
CentOS(5.8/6.4)linux生产环境若干优化实战
查看>>
20145328 《信息安全系统设计基础》第5周学习总结
查看>>
10.使用子查询 ---SQL
查看>>
Linux下chkconfig命令详解
查看>>
坦克大战---可能带BUG
查看>>
excel表数据分列
查看>>
3、kvm虚拟机日常管理与配置
查看>>
php各个模式、版本的区别
查看>>
shell中的点命令与source命令
查看>>
我的友情链接
查看>>
百度 ueditor 富文本编辑器的使用心得 jsp版本 1.4的JDK weblogic8
查看>>
软件安装
查看>>
增加点访问量
查看>>
MongoDB笔记十七——Mongodb导入
查看>>
sdfgsdf
查看>>
别人的tomcat配置
查看>>
linux基础命令练习题
查看>>
《Memcached应用实战》
查看>>
我的友情链接
查看>>
Linux 基础学习 文件查找命令 find 部分用法
查看>>