我有以下类(class):
//Product class
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
//Package Class
public class Package {
@Id
@GeneratedValue
private Long id;
@OneToOne(cascade=CascadeType.ALL)
private Product product;
private int quantity;
private char mode;
private String unity;
private String description;
@OneToOne(cascade=CascadeType.ALL)
private Usuario user;
public class User {
@Id
private String email;
我可以插入产品、用户和程序包:
//.. (iniatilize product and user before and set in package object)
session.save(package);
session.getTransaction().commit();
那为什么我无法删除用户?
User user = new User();
user.setEmail("valter@gmail.com");
session.delete(user);
session.getTransaction().commit();
给我这个错误:
Cannot delete or update a parent row: a foreign key constraint fails
我的类(class)出了什么问题?
完整的实体用户
@Entity
public class Usuario {
@Id
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Entity
public class Package{
@Id
@GeneratedValue
private Long id;
@OneToOne(cascade=CascadeType.ALL)
private Product product;
private int quantity;
private char mode;
private String unity;
private String description;
@OneToOne(cascade=CascadeType.ALL)
private User user;
@Entity
public class Product {
@Id
@GeneratedValue
private Long id;
private String name;
这是系统中涉及的所有实体。
@Bozho 根据你的说法,应该是这样吧?
@Entity
public class User{
@Id
private String email;
@OneToOne(cascade=CascadeType.ALL)
private List<Package> packages;
我正在尝试执行此方法:
private static void deleteUser() {
Session session = new HibernateUtil().getSession();
session.beginTransaction();
try{
User usuario = (Usuario) session.load(Usuario.class, "valter@gmail.com");
session.delete(usuario);
session.getTransaction().commit();
}catch(HibernateException he){
session.getTransaction().rollback();
}finally{
session.close();
}
}
最佳答案
看来您正在创建一个分离的实体并尝试删除它,而不是从数据库中获取完整的实体。在这种情况下,即使您定义了级联,它们也不会工作,因为 User
的关系实体未填充。
如果电子邮件是主键,那么您应该执行以下操作:
User user = session.load(User.class, "foo@bar.com");
session.delete(user)
即使如此,如果任何其他实体引用 User
,它在逻辑上会失败 - 只需查看数据库约束。您有多种方法可以解决此问题:
- map
List<Package>
在您的用户中,从而使关系成为双向的。因此,您将能够在User
上设置级联侧面也是如此 - 在删除用户之前,找到(通过查询)属于该用户的所有包,并将其删除。
- 如果包没有任何其他级联,请使用 HQL 查询:
DELETE FROM Package WHERE user=:user"
.
关于java - Hibernate:如何级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159775/