【发布时间】:2014-08-22 18:55:17
【问题描述】:
我正在开发一个 RESTful Web 应用程序(使用 hibernate 和 mysql),其规格如下:
- 数据库中有两个表,tableA 和 tableB。
- tableA 有名为 col1A 和 col2A 的列
- tableB 有名为 col1B、col2B 和 col1A 的列;最后一列 (col1A) 是外键,映射到 tableA 的主键。
表对应的JAVA类定义为:
class tableA {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@XmlTransient
private int col1A;
private string col2A;
// getters and setters
}
class tableB {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@XmlTransient
private int col1B;
@XmlTransient
@ManyToOne(cascade=CascadeType.REMOVE)
@JoinColumn(name = "col1A", referencedColumnName = "col1A", insertable = false, updatable = false)
private tableA tableAObj;
private string col2B;
// getters and setters
// There is a getter and setter for the col1A field as well.
}
当我从 tableA 中删除一行时,我假设 tableB 中引用被删除行的行应该自己删除(因为 CascadeType.REMOVE)。但是,我得到以下异常:
无法删除或更新父行:外键约束失败 (
pack1.tableB,约束FK27B8B255168D05外键 (col1A) 参考资料tableA(col1A))
我做错了什么?
谢谢。
更新:
一些变化:我在 tableA 中添加了注释,如下所示:
@XmlTransient
@OneToMany(cascade=CascadeType.REMOVE, orphanRemoval=true)
private List<Test> tableB;
我仍然得到与以前相同的异常。
我正在使用 EntityManger 的删除操作删除该行:
em.remove(t)
【问题讨论】:
-
您应该在 TableA (
@OnetoMany) 中创建 TableB 的映射。并注释这个集合@onDelete(action=OnDeleteAction.Cascade) -
@michikot,我正在使用 entitymanager 的 remove 从表中删除记录:em.remove(t),您指定的方法是否有效?
-
是的,我们在项目中使用过它。请查看我的更新\