休眠 - 从多对多删除

时间:2014-09-14 20:06:25

标签: java hibernate many-to-many

我有以下两个POJO:

@Entity(name = "project")
@Table(name = "project")
public class Project {
    @Column(name = "identifier")
    @Id
    @GeneratedValue
    private Integer identifier;

    @ManyToMany(cascade = CascadeType.ALL)
    private Set<Member> members = new HashSet<Member>();

    // --- constructors ---

    public Project() {
    }

    // --- getters ---

    public Integer getIdentifier() {
        return identifier;
    }

    public Set<Member> getMembers() {
        return members;
    }
}

@Entity(name = "member")
@Table(name = "member")
public class Member {
    @Column(name = "identifier")
    @Id
    @GeneratedValue
    private Integer identifier;

    @Column(name = "name", columnDefinition = "text")
    private String name;

    @ManyToMany(mappedBy = "members")
    private Set<Project> projects = new HashSet<Project>();

    // --- constructors ---

    public Member() {
    }

    // --- getters ---

    public Integer getIdentifier() {
        return identifier;
    }

    public String getName() {
        return name;
    }

    public Set<Project> getProjects() {
        return projects;
    }
}

从多对多关系中删除常见做法是什么?以下代码完美地运行,但它会产生大量开销。首先,有一些问题:

  1. 1个查询以获取由member.getProjects()
  2. 触发的项目
  3. N查询以获取由project.getMembers()
  4. 触发的每个项目的所有成员

    其次,获取项目(查询1)和成员(查询2)的完整数据集,而不仅仅是标识符。

    final Member member = ...;
    for (final Project project : member.getProjects()) {
        project.getMembers().remove(member);
    }
    db.delete(member);
    

    是否有可能在不强制编写即席查询的情况下提高效率?

1 个答案:

答案 0 :(得分:1)

看看这里:

How to remove entity with ManyToMany relationship in JPA (and corresponding join table rows)?

此外,您可以选择使用jpql语句删除数据:

http://docs.oracle.com/html/E24396_01/ejb3_overview_query.html#ejb3_overview_query_delete

但我认为第一个链接就是你要找的东西。