From 03e5a310712a870221bafce5a6aeeb4f0cf414c2 Mon Sep 17 00:00:00 2001 From: lipido Date: Thu, 23 Nov 2017 16:48:01 +0100 Subject: [PATCH] Adds removeEmployee method to Project --- .../dgpena/siexample/persistence/Project.java | 14 ++++++-- .../siexample/persistence/ProjectsTest.java | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/dgpena/siexample/persistence/Project.java b/src/main/java/dgpena/siexample/persistence/Project.java index 04a8cb8..6b877d2 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 51028b0..b40b029 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 -- 2.18.1