Bonjour à tous !
Voilà, je suis en train de réaliser une petite application en J2EE, qui fonctionne très bien avec Hibernate en mapping "standard", mais lorsque j'essaie de passer en annotations, rien ne va plus, je récupère cette exception : DuplicateMappingException.
Pour ne pas devoir faire des modifications de code trop coûteuse entre la version annotée et celle qui ne l'est pas, j'essaie de garder les 2 dans mon application, grâce au paramètre hibernate.mapping.precedence de mon fichier hibernate.cfg.xml. Cependant j'ai également testé la version en annotation seule, et ça ne fonctionne pas non plus ^^
Voici mon bean annoté :
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
|
package mywebapp.bean.data;
import javax.persistence.*;
import mywebapp.bean.form.ArticleForm;
@Entity
@Table(name="article")
public class Article {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String reference;
@Column(name="nom")
private String nom;
@Column(name="stock")
private int stock;
public Article(){}
public Article(String reference, String nom, int stock){
this.reference = reference;
this.nom = nom;
this.stock = stock;
}
public String getReference() {
return reference;
}
public void setReference(String reference) {
this.reference = reference;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public ArticleForm toArticleForm(){
return new ArticleForm(this.reference,this.nom);
}
} |
Le fichier Article.hbm.xml, dans le même dossier, qui me sert pour la mapping "standard" et que j'aimerais ne pas devoir supprimer :
1 2 3 4 5 6 7 8 9 10 11 12 13
|
<?xml version="1.0"?><!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mywebapp.bean.data.Article" table="article">
<id name="reference" type="string" column="reference">
<generator class="assigned"/>
</id>
<property name="nom" type="string" not-null="true" />
<property name="stock" type="integer" not-null="true" />
</class>
</hibernate-mapping> |
Mon fichier de configuration :
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
| <?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.password"></property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!-- thread is the short name for
org.hibernate.context.ThreadLocalSessionContext
and let Hibernate bind the session automatically to the thread
-->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.mapping.precedence">class, hbm</property>
<!-- mapping files -->
<mapping class="mywebapp.bean.data.Article" />
<mapping class="mywebapp.bean.data.Commande" />
<mapping resource="mywebapp/bean/data/Article.hbm.xml" />
<mapping resource="mywebapp/bean/data/Commande.hbm.xml" />
</session-factory>
</hibernate-configuration> |
Et pour finir, mes magnifiques exceptions :
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
| org.hibernate.DuplicateMappingException: Duplicate class/entity mapping mywebapp.bean.data.Article
org.hibernate.cfg.Mappings.addClass(Mappings.java:141)
org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:167)
org.hibernate.cfg.Configuration.add(Configuration.java:702)
org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:483)
org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277)
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1319)
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)
mywebapp.utils.HibernateFactory.createSessionFactory(HibernateFactory.java:16)
mywebapp.services.policy.GererArticlePolicy.getNbArticles(GererArticlePolicy.java:66)
mywebapp.action.OperationsAction.listerArticles(OperationsAction.java:106)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts.chain.commands.servlet.PerformForward.handleAsForward(PerformForward.java:113)
org.apache.struts.chain.commands.servlet.PerformForward.perform(PerformForward.java:96)
org.apache.struts.chain.commands.AbstractPerformForward.execute(AbstractPerformForward.java:54)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
Je croyais pouvoir définir une priorité entre le mapping "standard" et le mapping par annotation grâce à ce paramètre de mon fichier de configuration, mais a priori ça ne fonctionne pas :
<property name="hibernate.mapping.precedence">class, hbm</property>
Pour information, j'ai déjà essayé d'enlever mon fichier Article.hbm.xml ainsi que sa ligne de déclaration dans le fichier de configuration, mais ça n'a rien changé... Toujours cette même exception.
Voilà, si quelqu'un trouve une solution à mon problème, je suis ouverte à toute proposition !
Partager