2013-05-04 2 views
1

JPA에서 일대 다 관계가있는 두 엔티티에 이상한 문제가 있습니다. 나는 EclipseLink 2.3.2와 함께 Glassfish 3.1.2.2를 사용하고 있습니다. 이 첫 번째 엔티티입니다 :JPA OneToMany eager fetch가 작동하지 않습니다.

@NamedQueries({ 
    @NamedQuery(name="SampleQueryGroup.findAll", query="SELECT g FROM SampleQueryGroup g") 
}) 
@Entity 
public class SampleQueryGroup implements Serializable { 

    // Simple properties, including id (primary key) 

    @OneToMany(
     mappedBy = "group", 
     fetch = FetchType.EAGER, 
     cascade = {CascadeType.REMOVE, CascadeType.MERGE} 
    ) 
    private List<SampleQuery> sampleQueries; 

    // Gettes/setters, hashcode/equals 

} 

그리고이 두 번째입니다 :

@Entity 
public class SampleQuery implements Serializable { 

    // Simple properties, including id (primary key) 

    @ManyToOne(cascade = {CascadeType.PERSIST}) 
    private SampleQueryGroup group; 

    // Gettes/setters, hashcode/equals 

} 

내가 SampleQueryGroup.findAll라는 이름의 쿼리를 실행하기 위해 주입 EntityManager을 사용하는 무 상태 세션 빈을 가지고있다. 또한 SSB 메소드를 호출하고 메소드에 의해 반환 된 SampleQueryGroup 각각에 대해 SampleQueryGroup.getSampleQueries()을 통해 반복하는 CDI 관리 빈이 있습니다. 필자는 코드를 붙여 넣지 않았습니다. Java EE 응용 프로그램의 경우 매우 간단하고 어떻게 든 표준이되었습니다.

열심히 가져 오기가 작동하지 않고 getSampleQueries()이 빈 목록을 반환하는 것이 문제입니다. 그러나 가져 오기 유형을 다시 FetchType.LAZY로 변경하면 모든 것이 제대로 작동하고 목록이 올바르게 채워집니다. 나는 이것이 왜 일어나는 지 이해하지 못한다. 내부 캐싱 메커니즘과 관련이 있습니까?

답변

1

내 생각에 새 SampleQuery를 추가하면 SampleQueryGroup sampleQueries에 추가되지 않으므로 액세스 할 때 해당 SampleQuery가 아닌 것입니다. LAZY 일 때 SampleQuery를 삽입 할 때까지 트리거하지 않습니다. 그렇다면 거기에 있습니다.

관계의 양면을 유지해야합니다. (캐싱을 사용하지 않거나 개체를 새로 고칠 수도 있지만 코드는 여전히 손상 될 수 있습니다).

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

+0

난 그게 문제라고 생각 당신에게 제임스 감사드립니다. 엔티티를 지속시키는 SSB의 방법에서는 명시 적으로 각 엔티티를 다른 엔티티에 설정/추가해야합니까? –