• 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来删除实体的删除操作是不起作用的!!!

  • 相关阅读:
    Android应用集成支付宝接口的简化
    【已解决】 c8812在eclipse上调试打不出log来?求帮助如何解决?!!!
    listview SimpleAdapter 例子
    倒计时器, android版 8秒 Thread Handle
    ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
    对比mako模板继承与Django的模板继承
    python自省反射【转】
    from gensee的视频web框架/ 豆瓣
    django区别对待127.0.0.1和localhost?
    Jquery学习
  • 原文地址:https://www.cnblogs.com/chenhtblog/p/8065647.html
Copyright © 2020-2023  润新知