0

Joined, Multiple Table Inheritanceを実装しました。

「親」テーブルpoisと 2 つのサブテーブルxPoisyPoisがあり、PoiDao を拡張するXPoiDaoYPoiDaoクラスだけでなく、抽象PoiDaoクラスもあります

ポイには複数の予約がある場合がありますが、予約は 1 つのポイにのみ属します。

子テーブル DAO で定義された名前付きクエリは、それぞれの (直接) テーブル階層で定義された属性に対して適切に機能します。親テーブルには、reservationsという名前の別のテーブルとの外部キー関係があります(テーブル requests は、テーブルpoisの外部キーを保持します)。問題は、この予約テーブルのレコードが取得されないことです。

MySql Workbench でこの SQL ステートメントを実行すると、目的の結果セットが得られます。

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';

Eclipse では、デバッグ モードで xDao インスタンスを調べると、{IndirectList: not instanceiated}が表示されます。

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;
    ...
    }
4

1 に答える 1

0

あなたはFetchType.LAZYそこにいます。アクセスしようとすると、空のリストが表示されますか? デバッガーがフェッチ要求をトリガーしない場合があります。

于 2014-07-07T10:30:33.610 に答える