. 다른 기능을 사용하여 해당 Task
을 삭제하겠습니까?JPA OneToMany 양방향 병합은 어떻게 병합됩니까? <code>EntityManger</code> 갱신 <code>Task</code>의 컬렉션을 가지고 ProjectValue이 <code>EntityManger</code> 메모리에 프로그램에 의해 제거 아이 <code>Task</code>을 삭제할 수 없습니다 <code>@OneToMany</code> 양방향에서
DataStructure :
In ProjectPlan Table :
PRPJ0001, First Poject
In Task Table :
AAA, AAA, PRPJ0001
BBB, BBB, PRPJ0001
CCC, CCC, PRPJ0001
In Memory :
PRPJ0001, First Poject
AAA, AAA, PRPJ0001 --> No Changes
BBB, Change Name, PRPJ0001 --> Need to update
--> Need to delete CCC
NEW, NEW, PRPJ0001 --> Need to add
Problem : Entity Manger cannot delete CCC;
@Entity
public class ProjectPlan {
@Id
private String id;
private String name;
@OneToMany(mappedBy = "projectPlan", targetEntity = Task.class, cascade = {CascadeType.ALL})
private List<Task> taskList;
public ProjectPlan(){}
public ProjectPlan(String id, String name, List<Task> taskList) {
this.id = id;
this.name = name;
this.taskList = taskList;
}
//getter & setter
}
@Entity
public class Task {
@Id
private String id;
private String name;
@ManyToOne(targetEntity = ProjectPlan.class, cascade = {CascadeType.REFRESH})
@JoinColumn(name = "projectId", referencedColumnName = "ID")
private ProjectPlan projectPlan;
public Task(){
}
public Task(String id, String name, ProjectPlan projPlan) {
this.id = id;
this.name = name;
this.projectPlan = projPlan;
}
// getter & setter
}
public class Test {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA");
EntityManager em = emf.createEntityManager();
/*
Existing Data in Database
List<Task> taskList = new ArrayList<Task>();
ProjectPlan plan = new ProjectPlan("PRPJ0001", "First Poject", taskList);
Task task1 = new Task("AAA","AAA", plan);
Task task2 = new Task("BBB","BBB", plan);
Task task3 = new Task("CCC","CCC", plan);
taskList.add(task1);
taskList.add(task2);
taskList.add(task3);
*/
em.getTransaction().begin();
List<Task> taskList = new ArrayList<Task>();
ProjectPlan plan = em.find(ProjectPlan.class, "PRPJ0001");
/*Task "AAA" no changes*/
Task task1 = new Task("AAA","AAA", plan);
/*Task "BBB" updated info*/
Task task2 = new Task("BBB","Change Name", plan);
/*Task "CCC" removed*/
/*Task "NEW" newly created*/
Task task3 = new Task("NEW","NEW", plan);
taskList.add(task1);
taskList.add(task2);
taskList.add(task3);
plan.setTaskList(taskList);
em.merge(plan);
em.getTransaction().commit();
em.close();
}
}
Task
이 경우 다른 Sub Task List instance
(재귀 관계), Task
도있을 것입니다 이러한 상황에 직면 해있다. 실용적인 삭제가 필요한 작업을 확인하고 검색해야합니까? JPA
이이 기능을 지원해야한다고 생각하십니까?
JPA 2의 새로운 기능입니까? – CycDemo
@CycDemo이 게시물보기 http://stackoverflow.com/questions/4329577/jpa-2-0-orphanremoval-true-vs-on-delete-cascade – Jhonathan