休眠删除不会级联

Posted

技术标签:

【中文标题】休眠删除不会级联【英文标题】:Hibernate delete doesn't cascade 【发布时间】:2015-02-12 21:08:43 【问题描述】:

我有几个实体链接如下:

@Entity
@Table(name = "distribution_activity")
public class DistributionActivity extends AbstractActivity 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "activity", orphanRemoval = true)
    protected Set<DistributionTask> tasks = new TreeSet<>();

    ...

@Entity
@Table(name = "distribution_task")
public class DistributionTask extends AbstractTask 

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "activity_id")
    protected DistributionActivity activity;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "store_id")
    protected Store store;

    ...

@Entity
@Table(name = "store")
public class Store extends AbstractAuditableEntity 

    @OneToMany(cascade = CascadeType.REMOVE, fetch = FetchType.EAGER, mappedBy = "store", orphanRemoval = true)
    protected Set<DistributionTask> distributionTasks = new TreeSet<>();

    ...

仓库如下:

@Repository
public interface DistributionActivityRepository extends PagingAndSortingRepository<DistributionActivity, Long> 

@Repository
public interface StoreRepository extends PagingAndSortingRepository<Store, Long> 

我正在使用 mysql,并且在生成表时没有外键上的任何级联选项。当我删除 DistributionActivity 时,一切正常,Hibernate 实际上为每个链接任务发出删除语句。

hibernate.SQL:109 - delete from distribution_task where id=? and version=?
hibernate.SQL:109 - delete from distribution_activity where id=? and version=?

但是,当我删除 Store 时,不会为链接的任务生成删除语句,并且会引发 MySQLIntegrityConstraintViolationException 异常,涉及外键违规。

hibernate.SQL:109 - delete from store where id=? and version=?

有什么线索吗?

【问题讨论】:

检查哪个 fk 被违反,验证是否还有其他依赖于该 fk 的东西。您的代码对我来说看起来不错,也许您的 sn-ps 中没有显示额外的依赖项。 谢谢Yori,异常是从DistributionTask 和Store 之间的FK 抛出的。消息:无法删除或更新父行:外键约束失败 (sm.distribution_task, CONSTRAINT FK_dr8qheutxond3mpexbuvm6s9f FOREIGN KEY (store_id) REFERENCES store (id)) 如何生成表格?如果您使用 Hibernate Schema 生成;那么我建议删除所有表并重新生成您的架构。 是的,使用 Hibernate 模式。我已经尝试删除数据库并重新生成......同样的问题。 您能否发布成功删除 DistributionActivity 的代码的 sn-p 并尝试在其后立即删除 Store(引发异常的点)? 【参考方案1】:

你能在 session.delete() 发生删除的地方发布代码的 sn-p 吗?

我不能肯定地说,但在涉及双向关系之前,我遇到过类似的问题。简而言之,我需要确保在使用双向关系时对象是同步的。

在我看来,您想删除在 DistributionTask 中仍有引用的 Store。

例如,如果你有这样的事情:

session.delete(store);

然后,尝试更改如下:

distributionTask.setStore(null);
session.save(distributionTask);
session.delete(store);

所以;在处理双向关系时,您需要手动控制对象的一致性。

我希望它有所帮助。干杯,

【讨论】:

我明白了,但是 DistributionActivity 删除操作如何在没有任何手动操作的情况下顺利进行?

以上是关于休眠删除不会级联的主要内容,如果未能解决你的问题,请参考以下文章

休眠级联删除期间的ConstraintViolationException

休眠 - 多对多关系中的级联删除

休眠:是不是可以仅在测试时“保存级联”?

休眠一对多关联删除

休眠:分离没有级联到集合

休眠级联持续存在:执行隔离工作时出错