(Open-) JPA 1.0: список, связанный с OneToMany, имеет значение NULL при выборке в режиме отложенного просмотра - PullRequest
1 голос
/ 05 июля 2011

У меня проблема с JPA 1.0 (OpenJPA)

Следующая ситуация

@Entity
public class A{
    private Long aId;
    private List<B> bEntities;
    //myId getter and setter
    @OneToMany(mappedBy="referencedA")
    public List<B> getBEntities(){
        return bEntities;
    }
    public void setBEntities(List<B> bEntities){
        this.bEntities = bEntities;
    }
}  

@Entitiy
public class B{
    private Long bId;
    private Long aId;
    private A referencedA;
    //aId/bId getter and setter
    @ManyToOne
    @JoinColumn(name="A_ID", referencedColumnName="A_ID")
    public A getReferencedA(){
        return referencedA;
    }
    public void setReferencedA(A referencedA){
        this.referencedA = referencedA;
    }
}  

Если я выполняю следующий JPQL-запрос, он работает как положено, то есть каждый атрибут заполнен:

select object(o) from B o  

Но если я хочу получить все как:

select object(o) from A o  

и я пытаюсь получить B-список через aReceivedAObject.getBEntities (); он возвращает ноль.

Если я изменю или вернее добавлю аннотацию OneToMany следующим образом:

@OneToMany(mappedBy="referencedA", fetch=FetchType.EAGER)  

все работает как положено.

НО мне нужна ленивая загрузка, потому что все остальное будет слишком медленным.

Я действительно надеюсь, что кто-то может помочь мне решить проблему, так как я застрял в ней на три дня :(

Примечания, если важно:
Я (должен) использовать Websphere 6.1 (с Feature-Pack для EJB 3.0), который использует OpenJPA 1.0. Так что это проект JavaEE.
Насколько я понял OpenJPA-Doc, мне нужно включить расширение, что я и сделал, как описано здесь http://www.ibm.com/developerworks/websphere/techjournal/0612_barcia/0612_barcia.html#sec4f
Но, похоже, это не имеет значения :(

Заранее спасибо !!!
С уважением,
asotbb

// edit: исправлена ​​опечатка: изменено "public List getBEntities ()" на "public List getBEntities ()"

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если вы используете OneToMany в ленивом режиме и хотите использовать его вне транзакции, он будет нулевым или пустым списком, в зависимости от того, что является инициализированным значением поля (внутри транзакции JPA сделает другое запрос на выбор, так что это будет заполненный список). Используйте select o from A o join fetch o.as a (если в классе B список как поле называется as). Или используйте left join fetch, в зависимости от ваших потребностей.

0 голосов
/ 06 июля 2011

И из другого класса я вызываю метод findAll ADAL.

Да, это ваша проблема, если она не осведомлена о постоянстве, вам нужно сделать так, чтобы этот класс знал о контексте постоянства.если вы хотите, чтобы ReceivedAObject.getBEntities () работал с отложенной загрузкой.

Наличие постоянства происходит повсюду, хотя это может привести к беспорядку, так как вы можете быть вынуждены вручную объединять сущности между ними.Еще один способ сделать это - добавить метод getBEntities() в слой доступа к данным (ADAL).

...