简体   繁体   English

休眠-从多对多删除

[英]hibernate - delete from many-to-many

I have the following two POJOs: 我有以下两个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;
    }
}

and

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

What is common practise do delete from a many-to-many relation? 从多对多关系中删除的常见做法是什么? The following code works perfectly, but it generates a lot of overhead. 以下代码可以完美运行,但是会产生大量开销。 First, there are some queries: 首先,有一些查询:

  1. 1 query to get the projects, triggered by member.getProjects() 1个查询以获取项目,由member.getProjects()触发
  2. N queries to get all members of the each project, triggered by project.getMembers() N个查询,以获取由project.getMembers()触发的每个项目的所有成员

Second, the complete data set of the project (query 1) and member (query 2) is fetched, and not only the identifier. 其次,获取项目(查询1)和成员(查询2)的完整数据集,而不仅仅是标识符。

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

Is it possible to do this more efficient without being forced to write ad-hoc queries? 是否可以在不被迫编写临时查询的情况下提高效率?

Take a look here: 在这里看看:

How to remove entity with ManyToMany relationship in JPA (and corresponding join table rows)? 如何在JPA中删除具有ManyToMany关系的实体(以及相应的联接表行)?

Additionally you have the option to use jpql statements to delete data: 另外,您可以选择使用jpql语句删除数据:

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

But I think the first link is what you are looking for. 但是我认为第一个链接就是您要寻找的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM