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 :
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.
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
Aperçu de ma classe entité Message :
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;
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)
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 :
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 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); } }
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é...
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 tiens à préciser que dans mon pom.xml, j'ai exclu la dépendance jta javax.transaction :
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...
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>
Si quelqu'un a une idée...
Merci d'avance et bonne journée.
Partager