0

OpenJPA 2.2.1 を使用していますが、次の問題が発生しました。

TypedQuery<OdpObjectScheduleEntity> q = em.createQuery(
    "SELECT s FROM OdpObjectScheduleEntity s WHERE s.updateFreq IS NOT NULL",
    OdpObjectScheduleEntity.class);
List<OdpObjectScheduleEntity> result = q.getResultList();

これはOdpObjectScheduleEntity次のとおりです。

package ru.focusmedia.odp.server.datastore.jpa.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ru.focusmedia.odp.server.datastore.api.objects.OdpObjectScheduleRecord;

@Entity
@Table(name = "object_schedules")
public class OdpObjectScheduleEntity implements OdpObjectScheduleRecord {
    // fetch=FetchType.EAGER is the default. 
    // I've also tried explicitly setting it, no difference.
    @OneToOne(optional = false) 
    @Column(nullable = false)
    @Id
    private OdpObjectEntity object;

    @Column(name = "update_freq_seconds", nullable = true)
    private Integer updateFreq;

    protected OdpObjectScheduleEntity() {
        // for JPA
    }

    public OdpObjectScheduleEntity(OdpObjectEntity object, Integer updateFreq) {
        this.object = object;
        this.updateFreq = updateFreq;
    }

    @Override
    public OdpObjectEntity getObject() {
        return object;
    }

    @Override
    public Integer getUpdateFreq() {
        return updateFreq;
    }

    public void setUpdateFreq(Integer updateFreq) {
        this.updateFreq = updateFreq;
    }

    @Override
    public String toString() {
        return "OdpObjectScheduleEntity [object=" + object + ", updateFreq="
                + updateFreq + "]";
    }
}

しかし、 の要素は、resultオブジェクトが遅延してフェッチされているように見えますOdpObjectScheduleEntity [object=OdpObjectEntity [id=23851, name=null, parent=null, odpClass=null], updateFreq=120]。明らかな何かが欠けているのでしょうか、それとも OpenJPA のバグですか? 私は何かひどいことをすることでこれを回避することができます

for (OdpObjectScheduleEntity schedule : result) {
    // simply schedule.getObject() doesn't work
    schedule.getObject().toString();
}

関係を強制的にロードするより良い方法はありますか?

4

1 に答える 1

1

私はOpenJPAを使用したことがないので、正確に何が悪いのかはわかりませんが、次を使用してみてくださいJOIN FETCH

TypedQuery<OdpObjectScheduleEntity> q = em.createQuery(
    "SELECT s FROM OdpObjectScheduleEntity s LEFT JOIN FETCH s.object WHERE s.updateFreq IS NOT NULL",
    OdpObjectScheduleEntity.class);
List<OdpObjectScheduleEntity> result = q.getResultList();

詳細については、たとえばhttp://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_fetch_joinsを参照してください。

于 2013-02-03T09:32:26.257 に答える