Pourquoi ne getOne(...) sur un Ressort référentiel de Données pas de jeter un EntityNotFoundException?
Je suis en train de travailler sur un drôle de question, je faisais des tests d'intégration, l'appel de mon contrôleur pour obtenir un objet de base de données qui n'existe pas.
public Optional<T> get(Long id) {
try {
return Optional.ofNullable(repository.getOne(id));
} catch(EntityNotFoundException e) {
return Optional.empty();
}
}
Quand getOne(…)
n'est pas en mesure de trouver quoi que ce soit, je m'attendais à un EntityNotFoundException
mais en fait rien. Si je l'inspection de mon résultat, je peux voir que j'ai un vide entité avec un gestionnaire de lien "jeté EntityNotFoundException
" mais nous n'allons pas dans le catch et je retourne, en option, de cette étrange entité.
Je ne comprends pas ce comportement.
Pourquoi vous vous attendez à une excpetion? La javadoc de ne pas dire au sujet d'une exception.
C'est le classique de la JPA comportement lorsque vous appelez getOne() sur un non de données existantes.
En outre, je peux voir cette exception est levée, mais en quelque sorte de poignée, d'ici le printemps de données ?
C'est le classique de la JPA comportement lorsque vous appelez getOne() sur un non de données existantes.
En outre, je peux voir cette exception est levée, mais en quelque sorte de poignée, d'ici le printemps de données ?
OriginalL'auteur Seb | 2015-08-28
Vous devez vous connecter pour publier un commentaire.
Cela est dû à la façon JPA spécifie
EntityManager.getReference(…)
de travail. Il est censé retourner un proxy qui va résoudre l'objet doit être renvoyé sur le premier accès d'une propriété ou de jeter le contenu de l'exception éventuellement.La meilleure façon de contourner cela est de simplement utiliser
findOne(…)
au lieu de cela, comme ceOptional.ofNullable(repository.findOne(…))
.findOne(…)
sera de retournull
dans le cas où aucun résultat n'est trouvé.Une manière plus avancée de la résolution de ce est de rendre le référentiel de retour
Optional
des instances directement. Ceci peut être réalisé par la création d'une base personnalisé référentiel de l'interface à l'aide deOptional<T>
comme type de retour de lafind…
-méthodes.Trouver un exemple complet de cette dans le Le printemps des exemples de Données de référentiel.
Il y a en effet une différence
getOne(…)
n'est pas immédiatement matérialiser l'objet alors quefindOne(…)
. L'inconvénient de la première est qu'elle retarde l'échec dans la recherche, aussi, qui vous pique ici. Aussi,findOne(…)
va frapper le premier niveau de cache dans leEntityManager
dans une session particulière, vous n'aurez pas accès à la base de données deux fois. Si cela devient vraiment une question que vous pourriez voulez brancher un cache explicitement, mais je préfère le délai jusqu'à la mesure montre vraiment, il y a un problème.très clair, merci pour votre aide !
OriginalL'auteur Oliver Drotbohm
C'est la façon dont il a travaillé pour moi
OriginalL'auteur VK321