【问题标题】:Hibernate: Issue with CascadeType.REMOVE休眠:CascadeType.REMOVE 的问题
【发布时间】:2014-08-22 18:55:17
【问题描述】:

我正在开发一个 RESTful Web 应用程序(使用 hibernate 和 mysql),其规格如下:

  1. 数据库中有两个表,tableA 和 tableB。
  2. tableA 有名为 col1A 和 col2A 的列
  3. 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),您指定的方法是否有效?
  • 是的,我们在项目中使用过它。请查看我的更新\

标签: mysql hibernate


【解决方案1】:

知道了,在tableA中添加mappedBy属性如下:

@XmlTransient
@OneToMany(cascade=CascadeType.REMOVE, orphanRemoval=true, mappedBy = "tableAObj")
private List<TableB> tableB;

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 2018-05-19
    • 2012-09-17
    • 2014-06-23
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多