2011-03-25 5 views
2

필자는 손으로 작성한 JDBC ORM 코드에서 Ebeans으로 프로젝트를 전환하기 시작했습니다. 지금까지 그것은 아주 좋았습니다. Ebeans는 가볍고 사용하기 쉽습니다.JPA & Ebean ORM : 빈 콜렉션이 비어 있지 않습니다.

그러나 나는 비어 있어야하는 일대 다 목록을 검색 할 때 실제로 그 안에 하나의 요소가 있습니다. 이 요소는 모든 null 필드가있는 일종의 프록시 객체로 보이므로 컬렉션을 반복하는 코드가 중단됩니다. 여기

내가 포함 시켰 단축 정의 :

@Entity 
class Store { 
    ... 
    @OneToMany(mappedBy="store",cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
    List<StoreAlbum> storeAlbums = new LinkedList<StoreAlbum>(); 
} 

@Entity 
class StoreAlbum { 
    ... 
    @ManyToOne(optional=false,fetch=FetchType.EAGER) 
    @JoinColumn(name="store_id",nullable=false) 
    Store store; 
} 

그 ... 모든 표준 getter 및 setter이있는 곳입니다.

Store s = server.find(Store.class) 
      .where() 
      .eq("store_id",4) 
      .findUnique(); 

Assert.assertEquals("Sprint",s.getStoreName()); 
Assert.assertEquals(0, s.getStoreAlbums().size()); 

데이터베이스은 "스프린트"에 대한 '저장'행을 포함하는 것으로 알려져있다, 그리고 'store_album'테이블은 저장소에 대한 행이 포함되어 있지 않습니다 검색 코드는 다음과 같습니다.

JUnit 테스트는 두 번째 어설 션에서 실패합니다. 그것은 하나의 요소가있는 목록을 발견합니다. 이것은 어떤 종류의 손상된 StoreAlbum 객체입니다. 디버거는 객체가 "[email protected]"유형으로 표시되고 nullable = false (및 optional = false)로 선언 된 모든 필드에 대해 null 값을가집니다.

여기에 뭔가가 있습니까?

+0

나는 SQL 디버깅을 켜고 쿼리가 store_album 테이블 중 하나 인 "왼쪽 외부 조인"을 수행하고 있음을 발견했습니다. select t0.store_id c0, t0.store_name c1, t0.platform_name c2, t0.dsp_id C3, C4의 t1.store_id, t1.album_id의 C5, C6을 t1.dsp_id, 매장 T0 t1.pricecode_id로부터의 C7 는 t1.store_id = t0.store_id 여기서 t0.store_id = T1에 store_album의 가입 외측 왼쪽? 주문 t0.store_id 이 동작을 변경하는 방법이 있어야합니다. – homebrew

답변

1

생각 나는 이것에 대한 업데이트를 게시 할 것입니다 ... EBeans를 포기하고 대신 구현을 통해 MyBatis를 사용하도록 전환했습니다. MyBatis는 환상적입니다. 매뉴얼은 읽기 쉽고 철저합니다. MyBatis는 당신이 기대하는 바를 수행합니다. 나는 그것을 일어나서 곧바로 달린다.

EBeans는 연관된 콜렉션에 대한 조인이 null ID를 가져 오는 것을 감지하지 못했지만 MyBatis는이 시나리오를 깔끔하게 처리했습니다.

1

동일한 문제가 발생하여 보조 테이블 (StoreAlbum)에 ID 열을 추가하여 문제를 해결할 수있었습니다. 원인을 조사하지는 않았지만 이러한 상황에서 Ebean이 테이블에 기본 키가 필요하다고 가정합니다.

관련 문제