Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa @OneToMany关系属性未填充_Jpa_Jpql_Named Query_Table Per Subclass - Fatal编程技术网

Jpa @OneToMany关系属性未填充

Jpa @OneToMany关系属性未填充,jpa,jpql,named-query,table-per-subclass,Jpa,Jpql,Named Query,Table Per Subclass,我已经实现了连接的多表继承 有一个“父”表POI和两个子表:xPois和yPois,反过来我有一个抽象PoiDao类以及一个扩展PoiDao的XPoiDao和YPoiDao类 一个poi可能有多个预订,但一个预订只属于一个poi 在子表DAO中定义的命名查询对于在相应的直接表层次结构中定义的属性很有效。父表与另一个名为reservations的表具有外键关系。表reservations保留表POI的外键。问题是无法获取此保留表中的记录 在MySql Workbench中运行此SQL语句将获得所需

我已经实现了连接的多表继承

有一个“父”表POI和两个子表:xPois和yPois,反过来我有一个抽象PoiDao类以及一个扩展PoiDao的XPoiDao和YPoiDao类

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

在子表DAO中定义的命名查询对于在相应的直接表层次结构中定义的属性很有效。父表与另一个名为reservations的表具有外键关系。表reservations保留表POI的外键。问题是无法获取此保留表中的记录

在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:notinstanced}

如何使用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关系被同等定义:@onetomanyorphaneremovation=true,cascade=CascadeType.ALL,fetch=FetchType.LAZY@JoinColumnname=parkingPoiId,insertable=true,updateable=true私有列表操作小时;我没有问题。唯一的区别是:这些表与子表/类直接相关。不过,删除fetchtype应该不是必需的。如果您尝试使用指定的fetchtype访问它,它是否工作?我将保留的fetchtype设置为Earge,现在它工作了。谢谢。