我有几个实体链接如下:
@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实际上会为每个链接的任务发出delete语句。
hibernate.SQL:109 - delete from distribution_task where id=? and version=?
hibernate.SQL:109 - delete from distribution_activity where id=? and version=?
但是,当我删除存储时,不会为链接的任务生成删除语句,并且会引发引用外键冲突的MySQLIntegrityConstraintViolationException异常。
hibernate.SQL:109 - delete from store where id=? and version=?
有线索吗?
您能在session.delete()的删除位置发布代码片段吗?
我不能肯定地说,但我以前也遇到过类似的双向关系问题。简单地说,在使用双向关系时,我需要确保对象是同步的。
在我看来,您想要删除在DistributionTask中仍有引用的存储。
例如,如果你有这样的东西:
session.delete(store);
然后,尝试更改如下内容:
distributionTask.setStore(null);
session.save(distributionTask);
session.delete(store);
所以;在处理双向关系时,您需要手动控制对象的一致性。
我希望它能有所帮助。干杯,