所以我的休眠实现有问题。当我尝试删除父类时,在级联层次结构深处的类上收到外键约束异常。在详细介绍之前,我将首先描述类的关系,因为它关系到它们需要如何保存和删除。
在顶层,我有一个 Customer 类,其中包含一个 DefaultMask 对象列表。这是主列表,因为这些默认掩码由我的对象层次结构中的其他类使用,但始终来自此列表。仅在此列表中创建掩码并从此列表中删除。
在层次结构的更下方,我有一个 Column 类,它可以(可选地)在其上设置一个 DefaultMask。更简洁地描述这种关系;
客户拥有零到多个 DefaultMask。客户拥有零到多列。一列可能有一个 DefaultMask。
在我的应用程序中,当我尝试删除客户时,异常来自 Column 类到 DefaultMask 类的外键约束,我认为问题在于 CascadeType 的设置不正确。我已经研究了这个问题并找到了关于名为 mappedBy 的属性和使用 Hibernate 自己的 CascadeType.SAVE_UPDATE 的信息(为了防止 Hibernate 尝试删除由 Column 持有的 DefaultMask),但我承认我在这里有点迷路并且可以使用一些直接的指导。类的相关代码和实际的异常消息如下。
顾客:
@Entity
public class Customer {
@Id
private String id;
@OneToMany(cascade = CascadeType.ALL)
private List<DefaultMask> masks;
//(Columns are held further down in hierarchy)
柱子:
@Entity
@Table(name = "WarehouseColumn")
public class Column implements Comparable<Column> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int hibernateID;
@OneToOne
private DefaultMask mask;
默认掩码:
@Entity
public class DefaultMask implements Mask {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int hibernateID;
private String type;
private String mask;
异常消息:
org.hibernate.exception.ConstraintViolationException: 无法删除或更新父行:外键约束失败( hibernate
. WarehouseColumn
, CONSTRAINT FK8BB153D994AD57D3
FOREIGN KEY ( mask_hibernateID
) REFERENCES DefaultMask
( hibernateID
)) 原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 无法删除或更新父行:外键约束失败 ( hibernate
. WarehouseColumn
, CONSTRAINT FK8BB153D994AD57D3
FOREIGN KEY ( mask_hibernateID
) REFERENCES DefaultMask
( hibernateID
))