【问题标题】:@OneToMany relationship property not filled@OneToMany 关系属性未填充
【发布时间】:2014-08-27 19:23:51
【问题描述】:

我已经实现了Joined, Multiple Table Inheritance

有一个“父”表 pois 和两个子表:xPoisyPois 反过来我有一个抽象 PoiDao 类以及 XPoiDaoYPoiDao 类扩展 PoiDao

一个 poi 可能有多个预留,但一个预留只属于一个 poi。

在子表 DAO 中定义的命名查询适用于在相应(直接)表层次结构中定义的属性。父表与另一个名为 reservations 的表有外键关系(表 reservations 持有表 pois 的外键)。问题是没有从这个 reservations 表中获取记录。

在 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 instantiated}

如何使用 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;
    ...
    }

【问题讨论】:

    标签: jpa jpql named-query table-per-subclass


    【解决方案1】:

    你有FetchType.LAZY 在那里。当您尝试访问它时,您会得到一个空列表吗?调试器可能不会触发获取请求。

    【讨论】:

    • 嗯,成功了。 :)) 我还有其他几个同样定义的@OneTomany 关系:@OneToMany(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.LAZY) @JoinColumn(name="parkingPoiId",insertable=true,updatable=true) private List 运营时间;我那里没有问题。唯一的区别:这些表与子表/类直接相关。
    • 虽然没有必要删除 fetchtype。如果您尝试访问它(使用指定的 fetchtype),它会起作用吗?
    • 我将预订的获取类型设置为 EAGER,现在它可以工作了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多