Bonjour j'ai un problème que je n'arrive pas à comprendre, il me semble avoir configuré correctement mes entity avec les bonnes relations... J'ai toutes mes relation ne faisant pas référence à une collection qui fonctionnent (OneToOne et ManyToOne) mais dès que je tente d'obtenir quelque chose avec une collection (ManyToMany ou OneToMany) j'ai hibernatetool qui me fait l'erreur suivante :
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 [hibernatetool] Executing Hibernate Tool with a JPA Configuration [hibernatetool] 1. task: hbm2ddl (Generates database schema) [hibernatetool] An exception occurred while running exporter #2:hbm2ddl (Generates database schema) [hibernatetool] To get the full stack trace run ant with -verbose [hibernatetool] org.hibernate.MappingException: Could not determine type for: java.util.Collection, at table: Application, for columns: [org.hibernate.mapping.Column(profils)] BUILD FAILED C:\Sarapis\build.xml:75: org.hibernate.MappingException: Could not determine type for: java.util.Collection, at table: Application, for columns: [org.hibernate.mapping.Column(profils)] at org.hibernate.tool.ant.HibernateToolTask.reportException(HibernateToolTask.java:226) at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:189) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) at sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:357) at org.apache.tools.ant.Target.performTasks(Target.java:385) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329) at org.apache.tools.ant.Project.executeTarget(Project.java:1298) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.eclipse.ant.internal.core.ant.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) at org.apache.tools.ant.Project.executeTargets(Project.java:1181) at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:623) at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:456) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.ant.core.AntRunner.run(AntRunner.java:377) at org.eclipse.ant.internal.ui.launchConfigurations.AntLaunchDelegate$1.run(AntLaunchDelegate.java:230) at java.lang.Thread.run(Unknown Source) Caused by: org.hibernate.MappingException: Could not determine type for: java.util.Collection, at table: Application, for columns: [org.hibernate.mapping.Column(profils)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:269) at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:138) at org.hibernate.mapping.Column.getSqlType(Column.java:182) at org.hibernate.mapping.Table.sqlCreateString(Table.java:397) at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:854) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:94) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61) at org.hibernate.tool.ant.Hbm2DDLExporterTask.execute(Hbm2DDLExporterTask.java:45) at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186) ... 22 more --- Nested Exception --- org.hibernate.MappingException: Could not determine type for: java.util.Collection, at table: Application, for columns: [org.hibernate.mapping.Column(profils)] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:269) at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:138) at org.hibernate.mapping.Column.getSqlType(Column.java:182) at org.hibernate.mapping.Table.sqlCreateString(Table.java:397) at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:854) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:94) at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:61) at org.hibernate.tool.ant.Hbm2DDLExporterTask.execute(Hbm2DDLExporterTask.java:45) at org.hibernate.tool.ant.HibernateToolTask.execute(HibernateToolTask.java:186) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) at sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:357) at org.apache.tools.ant.Target.performTasks(Target.java:385) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1329) at org.apache.tools.ant.Project.executeTarget(Project.java:1298) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.eclipse.ant.internal.core.ant.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) at org.apache.tools.ant.Project.executeTargets(Project.java:1181) at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:623) at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:456) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.ant.core.AntRunner.run(AntRunner.java:377) at org.eclipse.ant.internal.ui.launchConfigurations.AntLaunchDelegate$1.run(AntLaunchDelegate.java:230) at java.lang.Thread.run(Unknown Source)
sinon voici mes 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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 package esco.sarapis.entity.application; import java.util.ArrayList; import java.util.Collection; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import esco.sarapis.entity.common.APersonne; import esco.sarapis.entity.common.AbstractEntity; import esco.sarapis.entity.groupe.Profil; @Entity public class Application extends AbstractEntity{ //Attibuts private CategorieApplication categorie; private String description; private String identifiant; private String nom; private String password; //Constructeurs public Application(){ super(); } public Application(String identifiant, String password, String nom, CategorieApplication categorie) { super(); this.identifiant = identifiant; this.password = password; this.nom = nom; this.categorie = categorie; } //Accesseurs @Enumerated(EnumType.STRING) public CategorieApplication getCategorie() { return categorie; } public String getDescription() { return description; } public String getIdentifiant() { return identifiant; } public String getNom() { return nom; } public String getPassword() { return password; } public void setCategorie(CategorieApplication categorie) { this.categorie = categorie; } public void setDescription(String description) { this.description = description; } public void setIdentifiant(String identifiant) { this.identifiant = identifiant; } public void setNom(String nom) { this.nom = nom; } public void setPassword(String password) { this.password = password; } //Relations private Collection<Profil> profils = new ArrayList<Profil>();; private APersonne proprietaire; @ManyToMany (cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch = FetchType.EAGER) @JoinTable(name="applications_profils", joinColumns= @JoinColumn(name="APPLICATION_ID", referencedColumnName="ID"), inverseJoinColumns= @JoinColumn(name="PROFIL_ID", referencedColumnName="ID")) public Collection<Profil> getProfils() { return profils; } public void setProfils(Collection<Profil> profils) { this.profils = profils; } @ManyToOne @JoinColumn(name="apersonne_fk") public APersonne getProprietaire() { return proprietaire; } public void setProprietaire(APersonne proprietaire) { this.proprietaire = proprietaire; } @Override public String toString() { // TODO Auto-generated method stub return super.toString()+String.format("Application[%s,%s,%s,%s]", this.categorie,this.description, this.identifiant, this.nom); } }Mon entity AGroupe dont profil hérite.
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 package esco.sarapis.entity.groupe; import java.util.ArrayList; import java.util.Collection; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import esco.sarapis.entity.application.Application; import esco.sarapis.entity.common.AGroupe; import esco.sarapis.entity.common.APersonne; import esco.sarapis.entity.structure.Etablissement; @Entity public class Profil extends AGroupe{ //Attributs private String regle_peuplement; //Constructeurs public Profil(String cn, CategorieGroupe categorie) { super(cn, categorie); } public Profil(){ super(); } //Accesseurs public String getRegle_peuplement() { return regle_peuplement; } public void setRegle_peuplement(String regle_peuplement) { this.regle_peuplement = regle_peuplement; } //Relations private Etablissement proprietaire; private Collection<Application> applications = new ArrayList<Application>(); @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},fetch = FetchType.EAGER,mappedBy="profils") public Collection<Application> getApplications() { return applications; } public void setApplications(Collection<Application> applications) { this.applications = applications; } @ManyToOne @JoinColumn(name="etablissement_fk") public Etablissement getProprietaire() { return proprietaire; } public void setProprietaire(Etablissement proprietaire) { this.proprietaire = proprietaire; } @Override public String toString() { // TODO Auto-generated method stub return super.toString()+String.format("Profil[%s]", this.regle_peuplement); } }
Voici mon abstractEnty dont toutes mes entity héritent.
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 package esco.sarapis.entity.common; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import esco.sarapis.entity.groupe.CategorieGroupe; @Entity @Inheritance(strategy=InheritanceType.JOINED) public abstract class AGroupe extends AbstractEntity{ //Attributs @Enumerated(EnumType.STRING) private CategorieGroupe categorie; private String cn; private String description; //Constructeurs public AGroupe(String cn, CategorieGroupe categorie) { super(); this.cn = cn; this.categorie = categorie; } public AGroupe(){ super(); } //Accesseurs public CategorieGroupe getCategorie() { return categorie; } public String getCn() { return cn; } public String getDescription() { return description; } public void setCategorie(CategorieGroupe categorie) { this.categorie = categorie; } public void setCn(String cn) { this.cn = cn; } public void setDescription(String description) { this.description = description; } @Override public String toString() { // TODO Auto-generated method stub return super.toString()+String.format("AGroupe[%s,%s,%s]", this.categorie, this.cn, this.description); } }
pour expliquer rapidement la relation application profil est de cardinalité n..m et vice versa.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 package esco.sarapis.entity.common; import java.io.Serializable; import java.util.Date; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Version; @MappedSuperclass public abstract class AbstractEntity implements Serializable{ //Attributs @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Version private int version; @Temporal(value = TemporalType.TIMESTAMP) private Date dateCreation; @Temporal(value = TemporalType.TIMESTAMP) private Date dateModification; //Constructeur public AbstractEntity(){ this.dateCreation.getTime(); this.dateModification.getTime(); } //Accesseurs public long getId() { return id; } public void setId(long id) { this.id = id; } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public Date getDateCreation() { return dateCreation; } public void setDateCreation(Date dateCreation) { this.dateCreation = dateCreation; } public Date getDateModification() { return dateModification; } public void setDateModification(Date dateModif) { this.dateModification = dateModif; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((dateCreation == null) ? 0 : dateCreation.hashCode()); result = prime * result + ((dateModification == null) ? 0 : dateModification.hashCode()); result = prime * result + (int) (id ^ (id >>> 32)); result = prime * result + version; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof AbstractEntity)) return false; final AbstractEntity other = (AbstractEntity) obj; if (dateCreation == null) { if (other.dateCreation != null) return false; } else if (!dateCreation.equals(other.dateCreation)) return false; if (dateModification == null) { if (other.dateModification != null) return false; } else if (!dateModification.equals(other.dateModification)) return false; if (id != other.id) return false; if (version != other.version) return false; return true; } @Override public String toString(){ return String.format("Entity[%d,%d,%s,%s]", id, version, dateCreation.toString(),dateModification.toString()); } }
Si vous voulez d'autres information n'hésitez pas à me demander, là ça fait 1 journée déjà que je ne comprend pas mon problème.
Sinon voici mon script ant pour générer mon schema sql :
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
82
83
84
85
86
87
88
89 <project name="Sarapis" default="compile" basedir="."> <!-- nom du projet et version --> <property name="proj.name" value="Sarapis" /> <property name="proj.shortname" value="Sarapis" /> <property name="version" value="1.0" /> <!-- Propriété globales --> <property name="src.java.dir" value="src" /> <property name="lib.dir" value="lib" /> <property name="driver.jar" value="lib/mysql-connector-java-5.0.8-bin.jar" /> <property name="build.dir" value="bin" /> <property name="dist.dir" value="dist"/> <property name="ddl.dir" value="${build.dir}/properties/bd"/> <!-- le Classpath du projet --> <path id="project.classpath"> <fileset dir="${lib.dir}"> <include name="**/*.jar" /> </fileset> </path> <path id="jpatoolslib"> <path location="lib/hibernate3.jar" /> <path location="lib/hibernate-tools.jar" /> <path location="lib/commons-logging-1.0.4.jar" /> <path location="lib/commons-collections-2.1.1.jar" /> <path location="lib/dom4j-1.6.1.jar" /> <path location="lib/freemarker.jar" /> <path location="${driver.jar}" /> </path> <path id="ejb3toolslib"> <path refid="jpatoolslib"/> <!-- ref to previously defined toolslib --> <path location="lib/hibernate-annotations.jar" /> <path location="lib/hibernate-commons-annotations.jar" /> <path location="lib/ejb3-persistence.jar" /> <path location="lib/hibernate-entitymanager.jar" /> <path location="lib/jboss-archive-browsing.jar" /> <path location="lib/javassist-3.7.jar" /> </path> <!-- Nettoyage projet --> <target name="clean" description="Nettoyer le projet"> <delete dir="${build.dir}"/> <mkdir dir="${build.dir}" /> <delete dir="${dist.dir}"/> <delete dir="${ddl.dir}"/> <mkdir dir="${ddl.dir}" /> </target> <target name="compile" depends="clean"> <javac srcdir="${src.java.dir}" destdir="${build.dir}" classpathref="project.classpath" /> <!-- Copy associated resource files --> <copy todir="${build.dir}/META-INF"> <fileset dir="${src.java.dir}/META-INF" includes="**/*"/> </copy> <copy todir="${build.dir}"> <fileset dir="${src.java.dir}/properties" includes="**/*"/> </copy> </target> <!-- Hibernate Tools --> <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="ejb3toolslib" /> <!-- Générer le schéma de la base --> <target name="DDL" depends="compile" description="Génération DDL base"> <mkdir dir="${ddl.dir}" /> <hibernatetool destdir="${basedir}"> <property key="jdk5" value="true" /> <property key="ejb3" value="true" /> <classpath path="${build.dir}" /> <!-- Utiliser META-INF/persistence.xml --> <jpaconfiguration /> <!-- export --> <hbm2ddl drop="true" create="true" export="false" outputfilename="${ddl.dir}/schema.sql" delimiter=";" format="true" /> </hibernatetool> </target> <!-- Générer la base --> <target name="BD" depends="compile" description="Génération BD"> <hibernatetool destdir="${basedir}"> <classpath path="${build.dir}"/> <!-- Utiliser META-INF/persistence.xml --> <jpaconfiguration /> <!-- export --> <hbm2ddl drop="true" create="true" export="true" outputfilename="${ddl.dir}/schema.sql" delimiter=";" format="true" /> </hibernatetool> </target> </project>
Partager