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