繁体   English   中英

休眠-从多对多删除

[英]hibernate - delete from 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. N个查询,以获取由project.getMembers()触发的每个项目的所有成员

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

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

是否可以在不被迫编写临时查询的情况下提高效率?

在这里看看:

如何在JPA中删除具有ManyToMany关系的实体(以及相应的联接表行)?

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

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

但是我认为第一个链接就是您要寻找的。

暂无
暂无

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

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