zoukankan      html  css  js  c++  java
  • Hibernate用JPA注解 CascadeType.REMOVE 不起作用的解决办法

    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 @Entity 14 @Table(name="user") 15 public class User implements Serializable { 16 17 private static final long serialVersionUID = 1L; 18 @Id 19 @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 @JsonIgnore 36 @OneToMany(targetEntity=Ticket.class,mappedBy="user",cascade = { CascadeType.REMOVE}) 37 private List<Ticket> 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 @Entity 16 @Table(name="ticket") 17 public class Ticket implements Serializable{ 18 private static final long serialVersionUID = 1L; 19 @Id 20 @GeneratedValue(strategy=GenerationType.IDENTITY) 21 private Integer id; 22 private String name; 23 private String type; 24 private Float price; 25 26 27 @JsonIgnore 28 @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 @Override 10 public void delete(Class<User> clazz, Serializable id) { 11 String name = clazz.getSimpleName();//User 12 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来删除实体的删除操作是不起作用的!!!

  • 相关阅读:
    win10 1607 安装密钥 GVLK
    计算机意外地重新启动或遇到错误。windows安装无法继续。若要安装windows 请单击 确定 重新启动计算机
    在Mac中使用「dd」指令烧录ISO镜像文件到U盘
    一款免费好用的正则表达式工具:Regex Match Tracer
    全国移动短信信息中心号码查询大全
    VS2008 LINK : fatal error LNK1104: cannot open file 'atls.lib'错误解决方案
    理解全概率公式与贝叶斯公式
    改善程序员生活质量的 3+10 习惯
    TCP选项之SO_RCVBUF和SO_SNDBUF
    OpenSSL开发学习总结
  • 原文地址:https://www.cnblogs.com/chenhtblog/p/8065647.html
Copyright © 2011-2022 走看看