Hibernate删除不会级联

时间:2015-02-12 21:08:43

标签: java hibernate orm

我有几个实体链接如下:

@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=?

任何线索?

1 个答案:

答案 0 :(得分:0)

你可以在session.delete()周围发布删除代码片段吗?

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

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

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

session.delete(store);

然后,尝试改变这样的事情:

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

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

我希望它有所帮助。欢呼声,