2014-07-07 2 views
0

을 구현했습니다. 복수 테이블 상속을 구현했습니다. xPoisyPois 차례로 나는 추상적 인 PoiDao 클래스뿐만 아니라 XPoiDaoYPoiDao 클래스가 :@OneToMany 관계 속성이 채워지지 않았습니다.

은 '부모'테이블 관심 장소과 두 개의 하위 테이블이 있습니다 연장 PoiDao.

poi는 여러 예약을 가질 수 있지만 예약은 정확히 하나의 poi에 속합니다.

자식 테이블 DAO에 정의 된 명명 된 쿼리는 해당 (직접) 테이블 계층에 정의 된 특성에 적합합니다. 상위 테이블은 예약 (테이블 예약)의 테이블과 외래 키 관계가 있습니다. 테이블 의 외래 키는입니다. 문제는이 예약 테이블의 레코드가 가져 오지 않는다는 것입니다. 내가 디버그 모드에서 xDao 인스턴스를 검사 할 때 :

SELECT * FROM xPois pp 
    LEFT JOIN pois p ON pp.poiId = p.poiId 
    LEFT JOIN reservations r ON p.poiId = r.poiId 
    WHERE pp.xPoiId = '2011'; 

이클립스에서 나는 {인스턴스화하지 IndirectList}을 볼 수 MySQL의 워크 벤치에서이 SQL 문을 실행

원하는 결과 집합을 가져옵니다.

이 테이블의 레코드를 JPA를 사용하여 PoiDao에 저장하려면 어떻게합니까?

public abstract class PoiDao implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="poiId") 
    private Integer poiId; 

    @OneToOne(optional=false, cascade=CascadeType.ALL) 
    @JoinColumn(name="addressId",insertable=true, 
    updatable=true, unique=true, nullable=false) 
    private AddressDao address; 

    @Embedded 
    private GeoLocationDao geoLocation; 

    @Convert("poiTypeConverter") 
    private ServiceTypeEnum poiType; 
    @Column(name="operator") 
    private String operator; 

    @Column(name="reservable") 
    private boolean reservable; 

    @OneToMany(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @JoinColumn(name="poiId", insertable=true, updatable=true) 
    private List<ReservationDao> existingReservations; 
    ... 
    } 

@Entity 
@Table(name="xPois") 
@DiscriminatorValue("X") 
@NamedQueries({ 
    @NamedQuery(name="XPoiDao.findAll", query="SELECT p FROM XPoiDao p"), 
    @NamedQuery(name="XPoiDao.findByXPoiId", 
       query="SELECT pp FROM XPoiDao pp LEFT JOIN PoiDao p ON pp.poiId = p.poiId " 
         + "LEFT JOIN ReservationDao r ON p.poiId = r.poiId WHERE pp.xPoiId = :xPoiId") 
}) 
@ObjectTypeConverters({ 
    @ObjectTypeConverter (
      name="xPoiStatusConverter", 
      dataType=java.lang.String.class,  // type in DB 
      objectType=XPoiStatusEnum.class, // Java type 
      conversionValues={ 
       @ConversionValue(dataValue="FREE", objectValue="FREE"), 
       @ConversionValue(dataValue="OCCUPIED BY VALUE", objectValue="OCCUPIED_BY_VALUE"), 
       @ConversionValue(dataValue="OCCUPIED MANUALLY", objectValue="OCCUPIED_MANUALLY"), 
       @ConversionValue(dataValue="BLOCKED", objectValue="BLOCKED") 
      } 
    ) 
}) 
public class XPoiDao extends PoiDao implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 2496267921294255723L; 

// @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="id") 
    private Integer    id; 

    @Column(name="xPoiId") 
    private String    xPoiId; 

    @Convert("xPoiStatusConverter") 
    @Column(name="status") 
    private XPoiStatusEnum status; 

    @Embedded 
    private ContactDao   contact; 

// @OneToMany(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
// @JoinColumn(name="poiId",insertable=true,updatable=true) 
// private List<ReservationDao> existingReservations; 

    @OneToMany(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
    @JoinColumn(name="parkingPoiId",insertable=true,updatable=true) 
    private List<OperatingHourDao> operatingHours; 
    ... 
    } 

답변

0

여기에 FetchType.LAZY이 있습니다. 그것에 액세스하려고하면 빈 목록이 생깁니 까? 디버거는 패치 요청을 트리거하지 않을 수 있습니다.

+0

글쎄, 그 속임수 않았다. :)) 나는 여러 가지 다른 @OneToMany 관계를 동등하게 정의 : \t \t @OneToMany (orphanRemoval이 = 사실, 캐스케이드 = CascadeType.ALL는 = FetchType.LAZY) \t @JoinColumn (이름 = "parkingPoiId을"가져 오기, 삽입 = true, updatable = true) \t 개인 목록 operatingHours; 문제가 없습니다. 유일한 차이점은 이러한 테이블이 하위 테이블/클래스와 직접 관련되어 있다는 것입니다. –

+0

그러나 fetchtype 제거는 필요하지 않습니다. fetchtype을 지정하여 액세스하려고하면 작동합니까? – Pimgd

+0

EAGER에 fetch 유형 fo 예약을 설정했는데 이제 작동합니다. 고마워. –

관련 문제