diff --git a/src/main/java/dgpena/siexample/persistence/Project.java b/src/main/java/dgpena/siexample/persistence/Project.java index 04a8cb8d0b34c282804a6509f07d30cae6607550..6b877d26c76f94d26282491b6cdc003cadbba875 100644 --- a/src/main/java/dgpena/siexample/persistence/Project.java +++ b/src/main/java/dgpena/siexample/persistence/Project.java @@ -20,7 +20,7 @@ public class Project { private String name; - @OneToMany(mappedBy="project", cascade = {CascadeType.REMOVE, CascadeType.PERSIST}) + @OneToMany(mappedBy="project", cascade = {CascadeType.REMOVE, CascadeType.PERSIST}, orphanRemoval = true) private Set projectAssignments = new HashSet<>(); public int getId() { @@ -54,9 +54,19 @@ public class Project { // the ProjectAssignment is automatically persisted due to CascadeType.PERSIST } + public void removeEmployee(Employee e) { + for (ProjectAssignment pa: this.projectAssignments) { + if (pa.getEmployee().equals(e)) { + // this will call internalRemoveProjectAssignment + pa.setProject(null); + + // the project assignment will be also removed from the DB due to "orphanRemoval" + } + } + } + void internalRemoveProjectAssignment(ProjectAssignment projectAssignment) { this.projectAssignments.remove(projectAssignment); - } void internalAddProjectAssignment(ProjectAssignment projectAssignment) { diff --git a/src/test/java/dgpena/siexample/persistence/ProjectsTest.java b/src/test/java/dgpena/siexample/persistence/ProjectsTest.java index 51028b0b8befdebc98c691b90b0ec88cc64a7f01..b40b0295ef1d01f736e38752b6717bfa126e5dfd 100644 --- a/src/test/java/dgpena/siexample/persistence/ProjectsTest.java +++ b/src/test/java/dgpena/siexample/persistence/ProjectsTest.java @@ -69,6 +69,39 @@ public class ProjectsTest extends SQLBasedTest { assertEquals(1, res.getInt("total")); } + @Test + public void testRemoveEmployeeFromProject() throws SQLException { + // insert a project previously with JDBC + int projectId = insertAProject(); + + // insert an employee previously with JDBC + int employeeId = insertAnEmployee(); + + // assign the employee to the project (which should be removed due to CascadeType.REMOVE + // in Project.projectAssignments) + Statement statement = jdbcConnection.createStatement(); + statement.executeUpdate("INSERT INTO ProjectAssignment(project_id, employee_id) values("+projectId+", " + +employeeId+")", Statement + .RETURN_GENERATED_KEYS); + + EntityManager em = emf.createEntityManager(); + + em.getTransaction().begin(); + Project p = new Projects(em).findById(projectId); + Employee e = new Employees(em).findById(employeeId); + + p.removeEmployee(e); + em.getTransaction().commit(); + + + // ensure that the project assignment does not exist + statement = jdbcConnection.createStatement(); + ResultSet res = statement.executeQuery("SELECT COUNT(*) as total from ProjectAssignment where employee_id = " + + ""+employeeId+" and project_id = "+projectId); + res.next(); + assertEquals(0, res.getInt("total")); + } + @Test public void testCreateProjectAssignment() throws SQLException { // insert a project previously with JDBC