2012-10-04 2 views
0

우리는 엔티티 같이이이 없습니다 FETCH 가입하세요. merge (User.INSTANCE) Item_x.user 속성이 NULL입니다.은 효과

JOIN FETCH 쿼리로 Item_x.user 속성을로드하여 (필요할 때) 특성이로드되었는지 확인합니다. 그러나 : 사용자 엔터티에 병합을 수행 한 경우 FETCH JOIN 경우에도 Item_x.user 속성은 NULL입니다.

은 내가 Item_x.INSTANCE 을 새로 고쳐 해결하려고하지만 난 호출 할 때 :

em.refresh(Item_x.Instance); 

=> 사용자가 null입니다.

데이터베이스를 보면 물론 사용자가 Item_x에 null이 아닌 것을 볼 수 있습니다.

OpenJPA가 Item_x에서 사용자를 올바르게로드하도록하려면 어떻게해야합니까? OpenJPA가 Item_x.user 속성을 올바르게 채우지 않는 이유는 무엇입니까/JOIN FETCH 문을 무시합니까?

+0

Eager loading? 사용자는 필요한 경우에만 가져옵니다. 즉, 게으름의 지점입니다. –

+0

네,하지만 사실 엔티티 "Item_x"를 업데이트 한 후 Item_x의 사용자 속성 (이전에 JOIN FETCH 쿼리로 페치를 강제 실행 한 경우)이 다시 비어 있습니다. 그게 문제 야. 나는 em.refresh (Item_x.Instance)에서 아무런 해결책도 보지 못했다. Item_x.user = NULL 인 채로 동일한 엔티티를 반환 할 것이기 때문입니다. 또한 FETCH JOIN을 다시 실행해도 사용자가 채워지지 않습니다. 그렇다면 엔티티가 Item_x.user를로드하도록 강제 할 수 있습니까? –

+0

질문의 단어를 다시 입력하십시오. 다른 사람이 귀하의 질문에 답변 할 수있는 기회를주기 위해 너무 많은 세부 사항을 생략하고 있습니다. – Rick

답변

1

양방향 관계가 아니라 단방향 관계를 만들었습니다. 클래스 중 하나는 다른 클래스에 대한 mappedBy 관계를 정의해야합니다.이 관계는 다른 클래스를 관계의 "소유자"로 정의합니다.

public User { 
    @OneToMany(targetEntity = Item_x.class, mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @ElementDependent 
    private List<Item_x> item_x_list = new ArrayList<Item_x>(); 
} 

public Item_x { 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id", insertable = true, updatable = true) 
    @Element(name = "user_id", required = false) 
    private Users user; 
} 

더 많은 정보가 OpenJPA documentation에서 사용할 수 있지만 그들은 더 명확 할 것 예를 놓치고 예를 들어, 다음과 같이 소유자로 Item_x를 정의하는 위의 예제를 변경할 수 있습니다.

+0

제안 된대로 mappedBy를 추가하면 다음과 같습니다. 새 항목 Item_x를 User.item_x_list의 목록에 추가 한 다음 em.merge (User.INSTANCE)를 호출하면 Item_x 테이블의 데이터베이스에 생성 된 레코드에 열 사용자가 있습니다 값은 NULL입니다. –

+0

@ Element 주석을 제거해보십시오. 나는 그것을 가지고 있기 때문에 거기에 놓았지만 실제로는 거기에 있어야한다고 나는 생각하지 않는다. – Templar

+0

@Element 주석은 XML 직렬화에서 가져온 것입니다 : org.simpleframework.xml.Element => 이것은 openJPA의 지속성 전략에 영향을 미치지 않아야합니다. –