2012-03-23 4 views
0

개체 제출과 일대 다 관계가있는 상위 개체 복합이 있습니다. 나는 다음과 같이 관계를 설정했다 :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의 의미를 잘못 이해하고 있어야합니다. 누군가 도와 주실 수 있습니까?

감사 제임스

답변

2

두 가지 문제 : 1) 당신은 모든 역 참조 개체도 삭제되도록해야 @PrivateOwned과의 관계를 표시했다.
2) 빈 콜렉션을 병합 중입니다. 캐스케이드 병합 (또는 그 부족)은 제출 항목에 병합 될 것임을 의미합니다. 컬렉션 자체의 상태는 Compound의 일부로 간주되므로 데이터베이스에서 업데이트해야합니다. # 1과 결합하면 제출이 삭제된다는 의미입니다. # 1의 경우가 아니라면, 제출물이 관계를 소유하고 변경되지 않았으므로 데이터베이스에는 변경 사항이 없지만 복합 엔티티를 다시 읽을 때 새로 고쳐지 지 않으면 null 또는 빈 콜렉션이 표시됩니다.

엔티티의 새 인스턴스를 만드는 것은 좋지 않은 아이디어입니다. 대신에 그것을 읽으면서 양식에서 필요한 것을 변경하는 것이 좋습니다. 필요할 경우이 엔티티를 트랜잭션 컨텍스트로 병합하십시오.

+0

안녕하세요. 귀하의 답변에 감사드립니다. 나는 당신이 옳다고 생각하고 CascadeType.MERGE가 지시하는 행동을 오해했습니다. 이것은 특정 Compound에 의해 참조 된 Submissions리스트가 병합되는지 여부보다는 각 Submission 참조가 병합되는지 여부를 결정합니다. 조언 해 주셔서 감사합니다. –

관련 문제