I have the following two POJOs:
@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 query to get the projects, triggered by
member.getProjects()
- N queries to get all members of the each project, triggered by
project.getMembers()
Second, the complete data set of the project (query 1) and member (query 2) is fetched, and not only the identifier.
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?