【发布时间】: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, CONSTRAINTFK_dr8qheutxond3mpexbuvm6s9fFOREIGN KEY (store_id) REFERENCESstore(id)) -
如何生成表格?如果您使用 Hibernate Schema 生成;那么我建议删除所有表并重新生成您的架构。
-
是的,使用 Hibernate 模式。我已经尝试删除数据库并重新生成......同样的问题。
-
您能否发布成功删除 DistributionActivity 的代码的 sn-p 并尝试在其后立即删除 Store(引发异常的点)?