2011-04-01 4 views
2

Dans mon entité UserTbl, j'ai ceJPA 2 one-to-one fetch = FetchType.EAGER ne fonctionne pas

@OneToOne(cascade = CascadeType.REMOVE, mappedBy = "user", fetch=FetchType.EAGER) 
private RetailPostUserTbl retailPostUser; 

@OneToOne(cascade = CascadeType.REMOVE, mappedBy = "user", fetch=FetchType.EAGER) 
private BackOfficeUserTbl backOfficeUser; 

Mais les deux sont toujours nuls.

Un utilisateur doit appartenir à au moins l'un d'eux ou aux deux, mais la requête renvoie toujours une valeur nulle.

J'ai essayé aller chercher via l'api de critères comme celui-ci

Root<UserTbl> root = cq.from(UserTbl.class); 
    root.fetch(UserTbl_.retailPostUser, JoinType.LEFT); 
    root.fetch(UserTbl_.backOfficeUser, JoinType.LEFT); 

Mais ils sont encore toujours nulle.

Des idées pour lesquelles cela ne fonctionne pas?

L'inverse fonctionne très bien, par exemple

dans RetailPostUserTbl, cela fonctionne

@OneToOne(optional = false, cascade=CascadeType.REMOVE) 
@PrimaryKeyJoinColumn 
private UserTbl user; 

Répondre

2

Vous devez faire quelque chose de mal lors de l'enregistrement ou la récupération de l'entité, pour @OneToOne cartographier la FetchType est par défaut EAGER et vous n'avez pas à le mentionner explicitement. Avez-vous essayé de charger l'entité par -

entityManager.find(); 

si au-dessus de méthode fonctionne et retourne l'entité avec tous les objets mis en correspondance puis vérifiez votre requête de critères.

+0

Cela renvoie également null et c'est pourquoi j'ai ajouté le FetchType.EAGER, l'inverse fonctionne, voir les nouvelles modifications –

+0

Je faisais les choses mal! Parce qu'il chargeait les objets lorsque les données réelles ont été demandées et que je faisais mes affirmations avant que cela n'arrive par introspection. –