을 구현했습니다. 복수 테이블 상속을 구현했습니다. xPois 및 yPois 차례로 나는 추상적 인 PoiDao 클래스뿐만 아니라 XPoiDao과 YPoiDao 클래스가 :@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;
...
}
글쎄, 그 속임수 않았다. :)) 나는 여러 가지 다른 @OneToMany 관계를 동등하게 정의 : \t \t @OneToMany (orphanRemoval이 = 사실, 캐스케이드 = CascadeType.ALL는 = FetchType.LAZY) \t @JoinColumn (이름 = "parkingPoiId을"가져 오기, 삽입 = true, updatable = true) \t 개인 목록 operatingHours; 문제가 없습니다. 유일한 차이점은 이러한 테이블이 하위 테이블/클래스와 직접 관련되어 있다는 것입니다. –
그러나 fetchtype 제거는 필요하지 않습니다. fetchtype을 지정하여 액세스하려고하면 작동합니까? – Pimgd
EAGER에 fetch 유형 fo 예약을 설정했는데 이제 작동합니다. 고마워. –