2012-09-05 3 views
0

질문과 문제는 매우 간단합니다.하지만 성가신 내용이지만 글로벌 솔루션을 찾고 있습니다. 응용 프로그램 전반에 걸친 문제입니다.엔티티를 추가해도 상위 콜렉션이 새로 고쳐지지 않습니다.

아래의 코드는 실제로 흥미롭지 않지만 명확히하기 위해 게시합니다!

우리는 JPA 2.0과 함께 PostgreSQL 데이터베이스를 사용하고 우리는 모든 facades와 엔티티를 생성했습니다. 물론 편집을 했었지만 실제로는 그렇지 않았습니다.

문제는 모든 엔티티에 자식 컬렉션이 포함되어 있지만 (우리 만 해당) 은 자식 요소 인이 자식 요소로 업데이트되지 않습니다. 개체는 데이터베이스에 기록되므로 쉽게 선택할 수 있지만 실제로보고 싶은 것은 부모 개체에있는 새로 고침 된 자식 컬렉션입니다.

왜 이런 일이 발생합니까? 우리가 (수동으로) 부모 em.refresh(parent)의 엔티티를 새로 고침하면 트릭을 수행하지만 Facades에서 많은 작업이 이루어질 것입니다. 하지만 다른 방법이 없을 수도 있습니다.

감사합니다.

/* EDIT */

나는 그것이 어떤 주석 문제 나 캐시 또는 뭔가하는 생각,하지만 난 이미

@OneToMany(mappedBy = "idquestion", orphanRemoval=true, fetch= FetchType.EAGER) 

@Cacheable(false) 

을 시도했습니다 didn를 ' 제대로 작동하지 않습니다.

/* 이해 EDIT */

일부 샘플 코드.

데이터베이스 레벨 :

CREATE TABLE Question (
     idQuestion SERIAL, 
     questionContent VARCHAR,  
    CONSTRAINT Question_idQuestion_PK PRIMARY KEY (idQuestion) 
); 

CREATE TABLE Answer (
     idAnswer SERIAL, 
     answerContent VARCHAR, 
     idQuestion INTEGER, 
    CONSTRAINT Answer_idAnswer_PK PRIMARY KEY (idAnswer), 
    CONSTRAINT Answer_idQuestion_FK FOREIGN KEY (idQuestion) REFERENCES Question(idQuestion) 
); 

우리가 그들 모두 유사, 넷빈즈 7.1에서 일부 엔티티를 생성 한보다 :

@Entity 
@Table(name = "question", catalog = "jobfairdb", schema = "public") 
@XmlRootElement 
@NamedQueries({ BLAH BLAH BLAH...}) 
public class Question implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @NotNull 
    @GeneratedValue(strategy= GenerationType.IDENTITY) 
    @Column(name = "idquestion", nullable = false) 
    private Integer idquestion; 
    @Size(max = 2147483647) 
    @Column(name = "questioncontent", length = 2147483647) 
    private String questioncontent; 
    @OneToMany(mappedBy = "idquestion", orphanRemoval=true) 
    private Collection<Answer> answerCollection; 

Getters... setters... 

우리가 사용 (다시) 그들을 위해 외관을 생성, 모두 구현 AbstractFacade like :

public abstract class CCAbstractFacade<T> { 
    private Class<T> entityClass; 

    public CCAbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

답변

1

아버지 엔티티가 자동으로 업데이트됩니다 당신이 container managed transactions을 사용하면 트랜잭션이 완료된 후에 콜렉션을 가져옵니다. 그렇지 않으면 컬렉션을 직접 업데이트해야합니다.

이 문서는 구체적으로이 동작을 설명합니다 JPA implementation patterns: Bidirectional associations

편집 :

컨테이너 관리 트랜잭션을 사용하는 가장 간단한 방법은 persistence.xmltransaction-type="JTA"을 가지고 Container-Managed Entity Managers을 사용하는 것입니다.

+0

세상에 ... 오, 그래 그 사실 트릭을 할 것입니다 :의 를하지만 내가 생각하는 것이 ... 너무 어려운 일부 @annotation와 Bidarectional 연결을 구현하는 방법은 없습니다 엔티티에? CMT를 지금 사용하는지 확실하지 않습니다. D – Atais

0

ManyToOne 쪽을 설정하는 것처럼 보이지만 OneToMany에 추가하지 않으면 둘 다 수행해야합니다.

JPA와 Java에서 일반적으로 양방향 관계의 양면을 업데이트해야합니다. 그렇지 않으면 객체의 상태가 동기화되지 않습니다. 그렇게하지 않으면 JPA뿐만 아니라 모든 Java 코드에서 잘못 될 수 있습니다.

JPA에는이 작업을 수행하는 데 필요한 마법이 없습니다. EclipseLink에는 사용자 정의 도구 (mapping.setRelationshipPartnerAttributeName())를 통해 설정할 수있는 마법 옵션이 있지만 권장되지는 않습니다. 코드를 수정하면 가장 좋은 해결책입니다.

참조, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

관련 문제