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

Spring Web Java Discussion :

Problème d'entité inconnue avec Spring/Hibernate


Sujet :

Spring Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Par défaut Problème d'entité inconnue avec Spring/Hibernate
    Bonjour à tous et bonne année !

    Je débute actuellement avec Spring et Hibernate. J'essaye de faire un exemple tout simple qui consiste à stocker un message en base de données en utilisant Spring, Spring MVC, Hibernate et Maven.

    J'ai un contrôleur "GuestbookController" qui va récupérer le message entré par l'utilisateur et faire appel à un service "GuestbookService", qui lui va également faire appel à une DAO "MessageDAOImpl" afin de stocker ce message en base de données. J'ai également une classe entité (POJO) "Message" qui contient un champ id ainsi qu'un string correspondant au message.

    Lors de l'envoi du message depuis le formulaire, j'ai une erreur de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: com.dgsi.guestbookv1.domain.Message; nested exception is org.hibernate.MappingException: Unknown entity: com.dgsi.guestbookv1.domain.Message
    J'en conclus donc qu'il s'agit d'un problème au niveau du mappage, cependant je ne trouve pas où se situe mon erreur.

    Aperçu de ma classe entité Message :
    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
     
    package com.dgsi.guestbookv1.domain;
     
    import java.io.Serializable;
    import java.util.Date;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.validation.constraints.Size;
    import javax.validation.constraints.NotNull;
     
    @Entity
    @Table(name="MESSAGE")
    public class Message implements Serializable {
     
    	final int MESSAGE_SIZE_MIN = 5;
    	final int MESSAGE_SIZE_MAX = 255;
     
    	@Id
    	@GeneratedValue
    	@Column(name="MESSAGE_ID")
    	private long id;
     
    	@Column(name="MESSAGE_MSG")
    	@NotNull
            @Size(min = MESSAGE_SIZE_MIN, max = MESSAGE_SIZE_MAX, message = "Le message doit contenir entre " + MESSAGE_SIZE_MIN + " et " + MESSAGE_SIZE_MAX + " caractères")
    	private String message;
     
            //... (constructeur, setteurs, getteurs)
    Comme vous pouvez le voir je n'ai pas oublié le @Entity et j'ai bien importé javax.persistence.Entity; au lieu de org.hibernate.annotations.Entity;

    Voilà ensuite ma DAO qui contient le setteur de la sessionFactory pour l'injection de dépendance par setteur ainsi qu'une méthode sauverMessage :
    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
     
    package com.dgsi.guestbookv1.dao;
     
    import org.hibernate.SessionFactory;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.transaction.annotation.Transactional;
    import com.dgsi.guestbookv1.domain.Message;
     
    public class MessageDAOImpl implements MessageDAO {
    	private HibernateTemplate hibernateTemplate;
     
    	public void setSessionFactory(SessionFactory sessionFactory) {
    		this.hibernateTemplate = new HibernateTemplate(sessionFactory);
    	}
     
     
    	@Transactional
    	public void sauverMessage(Message message) {
    		this.hibernateTemplate.save(message);
    	}
    }
    Et pour finir le fichier xml du contexte chargé contenant mes noeuds à injecter ainsi que la configuration d'Hibernate (dataSource et sessionFactory) :

    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
     
    <?xml version="1.0" encoding="utf-8" ?> 
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
     
    	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    		<property name="url" value="jdbc:hsqldb:mem:toto" /> 
    		<property name="username" value="sa" /> 
    		<property name="password" value="" /> 
    	</bean>
     
    	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    		<property name="dataSource" ref="dataSource" /> 
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
    				<prop key="hibernate.show_sql">true</prop> 
    				<prop key="hibernate.hbm2ddl.auto">update</prop> 
    				<prop key="hibernate.format_sql">true</prop>
    			</props>
    		</property>
    	        <property name="annotatedClasses">
            	        <list>
                	                <value>com.dgsi.guestbookv1.domain.Message</value>
            	        </list>
        	        </property>
     
    	</bean>
     
    	<!-- Injection par setter  -->
    	<bean id="MessageDAO" class="com.dgsi.guestbookv1.dao.MessageDAOImpl">
      		<property name="sessionFactory" ref="sessionFactory" />
      	</bean>
     
    	<bean id="GuestbookService" class="com.dgsi.guestbookv1.service.GuestbookService">
    		<property name="MessageDAO" ref="MessageDAO" />
    	</bean>
     
    	<bean id="guestbookcontroller" class="com.dgsi.guestbookv1.controller.GuestbookController">
    		<property name="GuestbookService" ref="GuestbookService" />
    	</bean>
     
    	<!-- Injection par constructeur -->
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                    <property name="sessionFactory" ref="sessionFactory" />
            </bean>
    </beans>
    Je n'ai aucun problème au niveau des injections et comme on peut le voir, je défini bien la classe annotée Message. Cependant il ne connait pas l'entité...

    Je tiens à préciser que dans mon pom.xml, j'ai exclu la dépendance jta javax.transaction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <dependency>
    		  <groupId>springframework</groupId>
    		  <artifactId>spring-hibernate</artifactId>
    		  <version>1.2.6</version>
    		  <exclusions>
    		  	<exclusion>
    		  		<artifactId>jta</artifactId>
    		  		<groupId>javax.transaction</groupId>
    		  	</exclusion>
    		  </exclusions>
    		</dependency>
    En effet, celle-ci créait un conflit entre Spring et Hibernate lors du chargement du transactionManager... je en sais pas si mon problème d'entité inconnue peut venir de ça...

    Si quelqu'un a une idée...

    Merci d'avance et bonne journée.

  2. #2
    Membre expérimenté Avatar de samy2525
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 259
    Par défaut persistence.xml
    Bonjour il faut que tu declare ta classe dans ton fichier de persistence utilisé par l'entityManager


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <persistence-unit name="tonpersistenceunit"
    		transaction-type="RESOURCE_LOCAL">
    		<provider>org.hibernate.ejb.HibernatePersistence</provider>		
     
    		<class>ton.package.Message</class>
             </persistence-unit>
    Bon courage

    Samy

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Par défaut
    Bonjour Sami,

    Merci pour ta réponse rapide, j'ai oublié de préciser que j'utilise JBoss comme serveur d'application.

    En regardant la doc j'ai trouvé ça : http://docs.jboss.org/jbossas/docs/S...h01s02s01.html

    J'ai donc créé le fichier persistence.xml suivant dans src/main/resources/META-INF/ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/
    ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
         <persistence-unit name="guestbookv1">
              <provider>org.hibernate.ejb.HibernatePersistence</provider>		
              <jta-data-source>java:/DefaultDS</jta-data-source> 
              <class>com.dgsi.guestbookv1.domain.Message</class>
         </persistence-unit>
    </persistence>
    Cependant, j'ai toujours la même erreur d'entité inconnue...

  4. #4
    Membre expérimenté Avatar de samy2525
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 259
    Par défaut Liaison persistence unit et la entityManagerFactory
    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
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    		<property name="dataSource" ref="dataSource" /> 
                    <property name="persistence-unit-name" ref="guestbookv1" /> 
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
    				<prop key="hibernate.show_sql">true</prop> 
    				<prop key="hibernate.hbm2ddl.auto">update</prop> 
    				<prop key="hibernate.format_sql">true</prop>
    			</props>
    		</property>
    	        <property name="annotatedClasses">
            	        <list>
                	                <value>com.dgsi.guestbookv1.domain.Message</value>
            	        </list>
        	        </property>
     
    	</bean>
    Je pense que c'est ça qui te manque dans ta configuration mais l'erreur à mon avis ce qu'il n'arrive pas à mapper le résultat de la requête et ton objet parce qu'il ne connais pas ton objet comme étant un objet à persister

    Bon courage

    Samy

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 13
    Par défaut
    Bonjour Samy,

    Merci pour ta réponse, malheureusement j'ai une erreur au moment du déploiement sur Jboss en rajoutant la ligne "<property name="persistence-unit-name" ref="guestbookv1" />" comme si il ne reconnaissait pas l'unité de persistence..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/appServlet/dao-context.xml]: Cannot resolve reference to bean 'guestbookv1' while setting bean property 'persistence-unit-name'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'guestbookv1' is defined

  6. #6
    Membre expérimenté Avatar de samy2525
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 259
    Par défaut
    Bonjour Yann, dsl c'est vrai ce n'est pas un bean.

    je ne connais pas trop JBOSS mais en cherchant un peu sur le NET j'ai trouvé ce topic qui pourra te servir

    http://docs.jboss.org/hibernate/enti...iguration.html

    J'espère que ça va t'aider.

    Samy

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de datasource avec Spring+Hibernate
    Par _MattU_ dans le forum Spring
    Réponses: 1
    Dernier message: 04/10/2013, 22h30
  2. Réponses: 19
    Dernier message: 03/07/2013, 09h26
  3. [Integration] Problème d'intégration d'un Applet JAVA tournant avec Spring / Hibernate / JPA
    Par anthony22360 dans le forum Spring
    Réponses: 1
    Dernier message: 02/07/2013, 16h41
  4. [article] Architecture GWT avec Spring, Hibernate et Maven
    Par guillaume.l dans le forum GWT et Vaadin
    Réponses: 0
    Dernier message: 24/02/2011, 22h04

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