IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

spring hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut spring hibernate
    bonjour

    je travaille sur un projet où j'utilise spring, hibernate et comme base de données postresql, donc voila, hibernate je sais le manipuler , spring je sais de quoi il s'agit , mais pour faire une combinaison entre les deux je trouve ça un peu à la Xfiles.

    je ne sais pas si vous avez des exemples concrets d'ajout suppression dans une table en utilisant les deux framework en l'occurrence hibernate, spring.

    merci de votre retour

  2. #2
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    pareil que toi je débute avec spring et voila comment je fais :
    La déclaration de la conf d'hibernate ne se fais plus dans hibernate-conf.xml mais dans applicationContext.xml qui est lui aussi placé dans WEB-INF.

    Ensuite moi les méthodes de mes classes où hibernate est utilisé pour l'accès en base, je les déclare transactionelles (spring gère ces transactions tout seul -> interet de spring à ce niveau)

    Voiçi un peu l'architecture (allégée) de mon projet pour comprendre le fichier de conf de spring :

    - une classe Utilisateur (POJO utilisé pour l'exemple).
    - une interface ISpringUserService implémentée par une classe SpringVoitureServicesImpl (classes de service Spring que je déclareraient transactionelles)
    - Cette classe SpringVoitureServicesImpl contient elle même un paramètre qui est une interface nommée IDAOVoitureService implémentée par la classe HibernateVoitureServiceImpl (classes de service Hibernate)

    Cette architecture est un peu lourde mais me permet de bien rendre indépendante la couche d'accès au donnée. Pour changer de base de données, je n'aurait que les classes hibernate à changer et les services spring resteront les mêmes.

    Voila pour la présentation.

    Maintenant, voiçi le fonctionnement : je déclare dans le fichier de conf (joint plus loin) que toutes les méthodes de la classe ISpringUserService sont transactionelles. A partir de ce moment là, dès qu'une de ces méthodes est appelée, spring intercepte le traitement et se charge des transactions commit, rollback etc...

    Maintenant voiçi le code (de mes classes d'abord) :
    Utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    public class Utilisateur {
        public int id;
        private String login;
        private String password;
        private String droits;
        private String nom;
        private String numeroDeTel;
        private String numeroDeTel2;
        private String numeroDePoste;
        private String nomDeService;
        private String divers;
     
        /********************************************************************************
        * Méthodes Get 
        ********************************************************************************/
       public int getId() {
            return id;
        }
        public String getLogin() {
            return login;
        }
        public String getPassword() {
            return password;
        }
        public String getDroits() {
            return droits;
        }
        public String getNom() {
            return nom;
        }
        public String getNumeroDeTel() {
            return numeroDeTel;
        }
        public String getNumeroDeTel2() {
            return numeroDeTel2;
        }
        public String getNumeroDePoste() {
            return numeroDePoste;
        }
        public String getNomDeService() {
            return nomDeService;
        }
        public String getDivers() {
            return divers;
        }
     
        /********************************************************************************
        * Méthodes Set 
        ********************************************************************************/
        public void setId(int i) {
            id = i ;
        }
        public void setLogin(String s) {
            this.login = s;
        }
        public void setPassword(String s) {
            this.password = s;
        }
        public void setDroits(String s) {
            this.droits = s;
        }
        public void setNom(String s) {
            this.nom = s;
        }
        public void setNumeroDeTel(String s) {
            this.numeroDeTel = s;
        }
        public void setNumeroDeTel2(String s) {
            this.numeroDeTel2 = s;
        }
        public void setNumeroDePoste(String s) {
            this.numeroDePoste = s;
        }
        public void setNomDeService(String s) {
            this.nomDeService = s;
        }
        public void setDivers(String s) {
            this.divers = s;
        }
    }
    Mapping Utilisateur.hbm.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <hibernate-mapping>
        <class name="fr.gestentrep2.utilisateurs.pojos.Utilisateur" table="T_USE_USER">
            <id name="id" column="use_id" type="int"><generator class="increment"/></id>
            <property name="login" column="use_login" type="string"/>
            <property name="password" column="use_password" type="string"/>
            <property name="droits" column="use_droits" type="string"/>
            <property name="nom" column="use_nom" type="string"/>
            <property name="numeroDeTel" column="use_numeroDeTel" type="string"/>
            <property name="numeroDeTel2" column="use_numeroDeTel2" type="string"/>
            <property name="numeroDePoste" column="use_numeroDePoste" type="string"/>
            <property name="nomDeService" column="use_nomDeService" type="string"/>
            <property name="divers" column="use_divers" type="string"/>
        </class>
    </hibernate-mapping>
    interface ISpringUserService :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface ISpringUserService {
        public abstract Utilisateur exists(String login, String password) throws LoginException;
    }
    classe SpringVoitureServicesImpl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class SpringUserServicesImpl implements ISpringUserService {
        public IDAOUserService serviceDAO;
     
        public SpringUserServicesImpl() {
            super();
        }
     
        public Utilisateur exists(String login, String password) throws LoginException {
            Utilisateur theUtilisateur = null;
            try {
                theUtilisateur = getServiceDAO().exists(login,password);
            } catch (RuntimeException e) { 
                throw new LoginException("Impossible de rechercher le login : " + login + " , " + password + "    ...    " + e.toString());
            }
            return theUtilisateur;
        }
     
        public IDAOUserService getServiceDAO() {
            return serviceDAO;
        }
     
        public void setServiceDAO(IDAOUserService serviceDAO) {
            this.serviceDAO = serviceDAO;
        }
    }
    interface IDAOUserService :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface IDAOUserService {
        public abstract Utilisateur exists(String login, String password);
    }
    classe HibernateUserServiceImpl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class HibernateUserServiceImpl implements IDAOUserService {
     
        private SessionFactory sessionFactory;
     
        public HibernateUserServiceImpl() {
            super();
        }
     
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
     
        public Utilisateur exists(String login, String password) {
            Session session = sessionFactory.getCurrentSession();
            Utilisateur theUtilisateur = (Utilisateur) session.createQuery("from Utilisateur where use_login = '" + login + "' and use_password = '" + password + "'").list().get(0);
            return theUtilisateur;
        }
    }
    (Ici on voit que spring gère tout seul les transactions

    Et maintenant le fichier de conf applicationContext.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
     
    <beans>    
    <!--                            HIBERNATE                               -->
        <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="mappingResources">
                <list>
                    <value>fr/gestentrep2/utilisateurs/pojos/Utilisateur.hbm.xml</value>
                    <value>fr/gestentrep2/voitures/pojos/Voiture.hbm.xml</value>
                </list>
            </property>        
            <property name="hibernateProperties">
                <props>
            <prop key="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://localhost/gestentrep2</prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password"></prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <!--  <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>-->
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
                    <prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
                </props>
            </property>        
        </bean>
     
        <bean id="myTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory"><ref local="mySessionFactory"/></property>
        </bean>
    <!--                            /HIBERNATE                               -->
     
     
    <!--                        MODE TRANSACTIONNEL                          -->
        <bean id="myUserTransactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
            <property name="transactionManager" ref="myTransactionManager"/>
            <property name="transactionAttributeSource">
                <value>fr.gestentrep2.utilisateurs.services.ISpringUserService.*=PROPAGATION_REQUIRED</value>
            </property>
        </bean>
     
        <bean id="mySpringUserServicesImpl" class="fr.gestentrep2.utilisateurs.services.spring.SpringUserServicesImpl">
            <property name="serviceDAO" ref="myHibernateUserService"/>
        </bean>
     
        <bean id="myUserService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="proxyInterfaces">
                <value>fr.gestentrep2.utilisateurs.services.ISpringUserService</value>
            </property>
            <property name="interceptorNames">
                <list>
                    <value>myUserTransactionInterceptor</value>
                    <value>mySpringUserServicesImpl</value>
                </list>
            </property>
        </bean>
    <!--                        /MODE TRANSACTIONNEL                          -->
     
     
        <bean id="myHibernateUserService" class="fr.gestentrep2.utilisateurs.services.hibernate.HibernateUserServiceImpl">
            <property name="sessionFactory"><ref local="mySessionFactory"/></property>        
        </bean>
     
    </beans>
    Voila j'espère que je t'ais pas trop embrouillé plus qu'autre chose.
    Moi aussi je débute (à vrai dire çà fait deux jours que je suis dessus et voila où j'en suis).

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    merci pour c'est eclaircissement, je pense que cela pourrai m'aider un peu pour voir plus clair encore , en fait moi j'ai reussi à faire les fichiers de conf, donc en l'occurrence applicationContext où je configure ma base ainsi que ceux de spring et hibernate sauf que ça bloque qlq part , mais je m'inspirerai de ton code pour voir mieux.

    merci encore une fois

  4. #4
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    Ok au fait j'ajoute mon fichier web.xml ou il y a aussi des définitions propres à spring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
        <!DOCTYPE web-app 
            PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd">
     
    <web-app>
     
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>        
        </context-param>
     
         <servlet>
          <servlet-name>SpringContextServlet</servlet-name>
          <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>      
          <load-on-startup>1</load-on-startup>
        </servlet>
     
        <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
        </servlet>
     
        <servlet-mapping>
            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>
    Ps: je m'inspire à fond de la doc de référence : http://static.springframework.org/sp...-reference.pdf

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Bonjour nikalkal,

    Dans ton exemple tout me semble clair sauf (et oui il y a une sauf ) l'utilité de la classe service par rapport au dao (quelle est la différence entre les deux)?

    Merci d'avance

  6. #6
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    Bonjour nikalkal,

    Dans ton exemple tout me semble clair sauf (et oui il y a une sauf ) l'utilité de la classe service par rapport au dao (quelle est la différence entre les deux)?

    Merci d'avance
    Bein si je décide d'utiliser une autre base de donnée, je n'ai qu'à changer la référence au bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        <bean id="mySpringUserServicesImpl" class="fr.gestentrep2.utilisateurs.services.spring.SpringUserServicesImpl">
            <property name="serviceDAO" ref="myHibernateUserService"/>
        </bean>
    dans applicationContext.xml et le tour est joué.

    Mon service spring est indépendant de mon service d'accès aux données. Ca sépare encore mieux la couche service de la couche DAO.

    Enfin je suis parti d'un exemple sur le web et je l'ais compris comme çà.

    Ca sert à rien pour toi?

    Merci d'avance

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Par défaut
    exactement, je suis tout à faut d'accord avec toi , en fait l'objectif c'est que le projet soit portable donc on est obligé de faire un fichier qui contient toute les configuration qui peuvent se modifier d'un environnement à l'autre

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Par défaut
    Citation Envoyé par nikalkal
    Bein si je décide d'utiliser une autre base de donnée, je n'ai qu'à changer la référence au bean :
    [code]
    Ca sert à rien pour toi?

    Merci d'avance
    Si si tout à fait!!!
    Mais dans la couche service tu mets quoi exactement (de manière générale dans une application)??

  9. #9
    Membre confirmé Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Par défaut
    Citation Envoyé par SEMPERE Benjamin
    Si si tout à fait!!!
    Mais dans la couche service tu mets quoi exactement (de manière générale dans une application)??
    Bein je ne suis pas expert mais je dirais toutes les méthodes d'appels à un service particulier.

    Ici, la couche service définit les méthodes d'accés aux données quelque soit la méthode d'accès aux données en base.

    Dans mon cas voiçi comment je décrirais l'architecture :


    @+

Discussions similaires

  1. [Spring][Hibernate] Transaction déclarative
    Par mauvais_karma dans le forum Hibernate
    Réponses: 13
    Dernier message: 03/07/2008, 17h09
  2. Réponses: 47
    Dernier message: 04/07/2006, 16h39
  3. [SPRING][HIBERNATE][MYSQL] insert et valeur des champs.
    Par nikalkal dans le forum Hibernate
    Réponses: 9
    Dernier message: 27/04/2006, 14h07
  4. Réponses: 2
    Dernier message: 16/02/2006, 09h04
  5. Réponses: 5
    Dernier message: 25/05/2005, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo