1

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

@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;
...
}

而关系的反面如下:

@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>();

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

em.createQuery("delete from StrategyGroup sg").executeUpdate();
em.createQuery("delete from Strategy s").executeUpdate();

这使我违反了@joinTable 的约束。另一方面,如果我按em.remove(strategyGroup);ti 删除工作正常 - 策略组被删除并且 @joinTable 被正确更新。

那么如何清空表呢?我需要加载对象并一一删除吗?

感谢帮助。

4

1 回答 1

3

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

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "groups")
private Set<Strategy> strategies = new HashSet<Strategy>();

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

现在回答你的问题:

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

于 2012-06-22T09:16:43.277 回答