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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值