개체 제출과 일대 다 관계가있는 상위 개체 복합이 있습니다. 나는 다음과 같이 관계를 설정했다 :Eclipselink OneToMany 병합 삭제 관계
@Entity
public class Compound implements Serializable {
@Id
private long compoundId;
...
@OneToMany(mappedBy="compound", fetch=FetchType.LAZY,
cascade={ CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE })
@PrivateOwned
private List<Submission> submissions;
...
}
@Entity
public class Submission implements Serializable {
@Id
private long submissionId;
...
@ManyToOne(fetch=FetchType.LAZY,
cascade={ CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE })
@JoinColumn(name="compoundId")
private Compound compound;
...
}
나는 선택한 콤파운드를 수정하기위한 형식을 (플렉스로) 설정했다. 양식 출력 (HashMap을 확장하는 ObjectProxy라고하는 BlazeDS 클래스)을 통해 폼의 값을 새 Compound 객체에 매핑합니다. 제출 데이터는 양식에 저장되지 않으므로 새로운 Compound 객체의 제출 목록은 null로 남습니다.
public Compound decodeWebForm(final ObjectProxy proxy) {
// create a new compound object
final Compound c = new Compound();
// map the proxy values onto the new compound
c.setCompoundId(proxy.get("compoundId"));
...
return updateCompound(c);
}
다음으로 구성한 Compound 객체를 영속 컨텍스트로 병합합니다.
public Compound updateCompound(final Compound c) {
// retrieve the entity manager
final EntityManager em = getEntityManager();
// begin a transaction
em.getTransaction().begin();
// merge changes to the managed compound
final Compound managed = em.merge(c);
// commit changes to the database
em.getTransaction().commit();
return managed;
}
특히 관계 정의에서 CascadeType.MERGE 지정 문을 생략했습니다. 따라서, EntityManager.merge (Compound) 메소드를 호출 할 때 제출 데이터의 부족이 무시 될 것으로 기대하고있었습니다. 그러나 이것은 사실이 아니며 수정중인 화합물과 관련된 제출물은 삭제됩니다.
내가 잘못했거나 CascadeType.MERGE의 의미를 잘못 이해하고 있어야합니다. 누군가 도와 주실 수 있습니까?
감사 제임스
안녕하세요. 귀하의 답변에 감사드립니다. 나는 당신이 옳다고 생각하고 CascadeType.MERGE가 지시하는 행동을 오해했습니다. 이것은 특정 Compound에 의해 참조 된 Submissions리스트가 병합되는지 여부보다는 각 Submission 참조가 병합되는지 여부를 결정합니다. 조언 해 주셔서 감사합니다. –