19
juin
2008
Application exemple (JPA managé par Spring)
juin
2008
Un article de djo.mos
12 Commentaires
Suite à ce billet que j’ai rédigé pour montrer comment mettre en place JPA/Hibernate en mode managé avec Spring, on m’a à maintes reprises demandé de fournir une application exemple pour montrer en pratique ces concepts.
Cela date déjà d’un peu, et je tiens à m’excuser pour ce retard (j’avais toutefois quelques empêchements: boulot, PC mort et remplacé par la suite, etc.).
En tout cas, bonne nouvelle: l’application exemple est enfin là et peut être téléchargée ici.
Il s’agit d’un WAR avec les sources.
J’ai en gros réfactoré l’application exemple de mon article « Création d’une application de type CRUD avec JSF et JPA » en injectant Spring dans l’équation.
Bonne exécution
Question: y a t il une réponse à ce sujet ? Est il possible d’utiliser cette architecture malgré tout au vu des évolutions de Spring, JPA, Hibernate ?
Merci.
djo.mos merci pour ton application est très complète et montre très bien comment utiliser en place une petit application web via Spring. Ca ma servit de base d’apprentissage de Spring.
Les deux choses qui manquent éventuellement sont :
– la gestion des rollback.
– La gestion de la fameuse : Lazy-Loading. Comme tu me l’as déjà expliqué le fait d’utiliser l’annotation
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
ne doit pas se faire en multi-thread et le Dao ne pourrait donc pas être un bean Spring singleton.
Tu as dit également que OpenSessionInViewInterceptor n’est qu’une solution partielle http://blog.developpez.com/djo-mos?title=mise_en_place_de_jpa_manage_par_spring#c37307
As-tu une solution propre est viable à nous proposer ?
Peux-tu nous montrer sur ton exemple comment l’appliquer ?
Merci.
djo.mos le truc est que je voulais éviter un rollback sur une runtime exception, enfin bon j’ai résolu mon problème des detached entity…
Par contre j’ai maintenant un problème de chargement de relation lazy, le proxy ne veut pas me donner les entity en relation avec l’entity principal s’ils sont en lazy mode. Une idée ? Je vois bien quelques solutions mais s’il y en avait une assez directe et évitant d’effectuer trop de requête ça m’arrangerai…
@nean_j> Je ne suis pas sûr d’avoir bien suivi : mais, les checked exception ne déclenchent pas de rollback (par défaut), ce comportement ne suffit pas ?
@Tail> Pourrais tu poster ça sur le forum s’il te plaît ?
Salut,
Trés interessant comme exemple. Je l’ai installé chez moi et configuré pourqu’il pointe sur ma base de donnees (mysql).
Mais au demarage de mon serveur tomcat, il trouve pas ma persistence unit qui est defini dans applicationContext.xml
….
p:persistence-unit-name= »jpa »
Voici l’erreur de tomcat :
…
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘dataSource’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.transaction.config.internalTransactionAdvisor': Cannot create inner bean ‘(inner bean)’ of type [org.springframework.transaction.interceptor.TransactionInterceptor] while setting bean property ‘transactionInterceptor'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘(inner bean)': Cannot resolve reference to bean ‘transactionManager’ while setting bean property ‘transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘transactionManager’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Cannot resolve reference to bean ‘entityManagerFactory’ while setting bean property ‘entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: No persistence unit with name ‘jpa’ found
Dois-je decalaré cette persistence unit sur mysql ou tomcat ?
une idée ?
Merci par avance.
Bonjour,
Par rapport à tout cela comment peut on faire pour intercepter les exceptions dans des transaction sans que le rollback se fasse et sans faire échouer l’exception ? J’aurai une solution de faire appel à une méthode spécifique avec un @Transactional et la propagation à REQUIRES_NEW, mais le problème est que cela provoque des detached entity… Auriez vous une solution ?
Merci
j ai fait une application avec hibernate jsf spring le problem c’est que je n’arrive pas à acceder aux donnnees merci de m’aider
nean_j> En fait, il est possible d’utiliser @TRansactional sur les interfaces, mais il faut que tu utilises les DynamicProxy du JDK, au lieu du proxying complet offert par les libs comme cglib, or, le proxying du JDK est très limité » et n’est pas vraiment utile en réalité.
Donc, c’est pour cela que ça ne marche pas dans ton cas: car Spring utilise cglib pour le proxying des classes.
Pour ce cas, la limitation vient du fait que les annotations ne sont pas héritables (de par leur définition), donc, la classe proxiée ne voit pas les annotations de l’interface.
Après plusieurs testes et péripéties j’ai réussi à faire tourner quelques chose, par contre il y a quelque chose que je ne comprend c’est pourquoi dans mon service, annoté avec @service les méthode annotés avec @transactionale ne sont pas prises en comptes, il faut que je mette cette annotation au niveau de l’implémentation de mon dao…
Auriez vous des informations par rapport à cela ?
merci
Super merci pour ce billet.
Exemple très intéressant merci, surtout le DAO générique!
C’est vrai qu’avec spring + jpa on a quasi la même chose qu’avec un conteneur ejb3 et on peut faire tourner ca sur un simple tomcat
Hello,
Yes! Je dois, dans peu de temps, mettre en place une architecture basée sur Hibernate et Spring!
Merci!