【发布时间】:2012-11-05 11:29:36
【问题描述】:
所以我的休眠实现有问题。当我尝试删除父类时,在级联层次结构深处的类上收到外键约束异常。在我详细介绍之前,我将首先描述类的关系,因为它关系到它们需要如何保存和删除。
在顶层,我有一个 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 (@ 987654329@))
引起:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(hibernate.WarehouseColumn,约束FK8BB153D994AD57D3外键(mask_hibernateID)参考@ 987654334@(hibernateID))
【问题讨论】: