JPA hibernatetool probleme avec collection
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:
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:
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);
}
} |
Code:
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);
}
} |
Mon entity AGroupe dont profil hérite.
Code:
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);
}
} |
Voici mon abstractEnty dont toutes mes entity héritent.
Code:
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());
}
} |
pour expliquer rapidement la relation application profil est de cardinalité n..m et vice versa.
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:
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> |