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

本文共 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

你可能感兴趣的文章
js兼容性大全
查看>>
晶振不起振的原因及其解决方法
查看>>
学习目标
查看>>
《利用python进行数据分析》学习笔记--数据聚合与分组(groupby)
查看>>
C++中的函数指针模板
查看>>
2015年个人总结
查看>>
C#编程(六)------------枚举
查看>>
高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
查看>>
ZOJ 3316 Game 一般图最大匹配带花树
查看>>
《系统架构师》——操作系统和硬件基础
查看>>
如何看待一本图书
查看>>
angularjs1-7,供应商
查看>>
oracle参数列表
查看>>
Wordpress3.2去除url中的category(不用插件实现)
查看>>
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine-Excel2003
查看>>
《Java 2 图形设计卷Ⅱ- SWING》第12章 轻量容器
查看>>
macOS Sierra 代码显示未来 Mac 将搭载 ARM 芯片
查看>>
《Arduino家居安全系统构建实战》——1.3 部署安全系统的先决条件
查看>>
Linux 中如何通过命令行访问 Dropbox
查看>>
《jQuery移动开发》—— 1.3 小结
查看>>