首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多表上的Hibernate批量删除

问多对多表上的Hibernate批量删除
EN

Stack Overflow用户
提问于 2012-06-22 17:01:16
回答 1查看 1.5K关注 0票数 1

还有另一个多对多的休眠问题。我有一个最简单的多对多映射,如下所示:

代码语言:javascript
复制
@Entity
public class Strategy implements Serializable {
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_GROUP_ID")})
    private Set<StrategyGroup> groups;
...
}

关系的另一边如下所示:

代码语言:javascript
复制
@Entity
public class StrategyGroup implements Serializable {

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "STRATEGY_TO_GROUP", joinColumns = {@JoinColumn(name="STRATEGY_GROUP_ID")}, inverseJoinColumns = {@JoinColumn(name = "STRATEGY_ID")})
    private Set<Strategy> strategies = new HashSet<Strategy>();

我现在要做的是以最简单的方式清空两个表。我正在尝试关注(em是我的entityManager)。

代码语言:javascript
复制
em.createQuery("delete from StrategyGroup sg").executeUpdate();
em.createQuery("delete from Strategy s").executeUpdate();

这使我违反了对@joinTable的约束。另一方面,如果我使用em.remove(strategyGroup);来删除,那么ti就能正常工作--策略组被删除,@joinTable被正确地更新。

那么我如何清空这个表呢?是否需要加载并逐个删除对象?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2012-06-22 17:16:43

首先,您的映射是错误的。关联的一侧必须是所有者侧,并定义关联的映射。另一个必须是插入端,只需使用mappedBy属性:

代码语言:javascript
复制
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "groups")
private Set<Strategy> strategies = new HashSet<Strategy>();

其次,您应该真正避免在toMany关联上急切获取,尤其是在两端:这将强制Hibernate递归地加载所有关联的实体,并且每次加载一行时都有很好的机会加载内存中两个表的所有行。

现在来回答你的问题:

如果要删除两个表中的所有内容,首先需要确保连接表为空,否则其中一个表中的某些行仍将被连接表的某一行引用,这显然会失败。要做到这一点,在执行已有的两个HQL查询之前,最好的选择是使用SQL查询删除连接表中的所有内容。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11153135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档