Validation failed for une entité
Bonjour,
Je trouve dans la console Eclipse cette erreur :
Citation:
10:52:34,836 WARN [SeamPhaseListener] uncaught exception, passing to exception handler
java.lang.IllegalStateException: Could not commit transaction
at org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:625)
...
Caused by: javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
...
Caused by: org.hibernate.validator.InvalidStateException: validation failed for: org.domain.stamas.entity.ThEtudiantEtu
at org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:148)
at org.hibernate.validator.event.ValidateEventListener.onPreUpdate(ValidateEventListener.java:177)
at org.hibernate.action.EntityUpdateAction.preUpdate(EntityUpdateAction.java:237)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:88)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
... 43 more
Déjà, ce que j'ai du mal à comprendre, vu que je débute dans le monde Hibernate, c'est pourquoi cette entité apparaît alors que je ne m'en sers pas.
Dans ma BDD et dans mes entités, ThEtudiantEtu hérite de ThCandidatCnd qui hérite de ThUtilisateurUti qui hérite de TePersonnePrs.
Dans Authenticator.java, je fais une requête sur ThUtilisateurUti pour vérifier le login de l'utilisateur puis je le redirige sur sa page d'accueil en fonction de son type utilisateur.
En l'occurrence, l'utilisateur est bien un étudiant mais je n'ai pas besoin de ses propriétés d'étudiant pour le moment.
Ce qui m'étonne encore plus, c'est que je viens de voir que dans le log, ça parle d'EntityUpdateAction alors que je ne fais aucun Update jusque là.
Voici ThEtudiantEtu :
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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| /**
* ThEtudiantEtu generated by hbm2java
*/
@Entity
@Table(name = "th_etudiant_etu")
@PrimaryKeyJoinColumn(name = "etu_id_candidat", referencedColumnName = "cnd_id_utilisateur")
public class ThEtudiantEtu extends ThCandidatCnd implements java.io.Serializable {
private int etuIdCandidat;
private TeEtablissementEtb teEtablissementEtb;
//private ThCandidatCnd thCandidatCnd;
private TeConcoursCcr teConcoursCcr;
private TrCommuneCmn trCommuneCmn;
private String etuAdresse;
private String etuCodePostal;
private Date etuDateNaissance;
public ThEtudiantEtu() {
}
public ThEtudiantEtu(TeEtablissementEtb teEtablissementEtb,
/*ThCandidatCnd thCandidatCnd,*/ TeConcoursCcr teConcoursCcr,
TrCommuneCmn trCommuneCmn, String etuAdresse, String etuCodePostal,
Date etuDateNaissance) {
this.teEtablissementEtb = teEtablissementEtb;
//this.thCandidatCnd = thCandidatCnd;
this.teConcoursCcr = teConcoursCcr;
this.trCommuneCmn = trCommuneCmn;
this.etuAdresse = etuAdresse;
this.etuCodePostal = etuCodePostal;
this.etuDateNaissance = etuDateNaissance;
}
@GenericGenerator(name = "genEtudiant", strategy = "foreign", parameters = @Parameter(name = "property", value = "thCandidatCnd"))
//@Id
@GeneratedValue(generator = "genEtudiant")
//@Column(name = "etu_id_candidat", unique = true, nullable = false)
@Transient
public int getEtuIdCandidat() {
return this.etuIdCandidat;
}
public void setEtuIdCandidat(int etuIdCandidat) {
this.etuIdCandidat = etuIdCandidat;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "etu_id_etablissement_origine", nullable = false)
@NotNull
public TeEtablissementEtb getTeEtablissementEtb() {
return this.teEtablissementEtb;
}
public void setTeEtablissementEtb(TeEtablissementEtb teEtablissementEtb) {
this.teEtablissementEtb = teEtablissementEtb;
}
/*@OneToOne(fetch = FetchType.LAZY)
//@PrimaryKeyJoinColumn(name = "etu_id_candidat")
@NotNull
public ThCandidatCnd getThCandidatCnd() {
return this.thCandidatCnd;
}
public void setThCandidatCnd(ThCandidatCnd thCandidatCnd) {
this.thCandidatCnd = thCandidatCnd;
}*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "etu_id_concours", nullable = false)
@NotNull
public TeConcoursCcr getTeConcoursCcr() {
return this.teConcoursCcr;
}
public void setTeConcoursCcr(TeConcoursCcr teConcoursCcr) {
this.teConcoursCcr = teConcoursCcr;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "etu_id_commune_residence", nullable = false)
@NotNull
public TrCommuneCmn getTrCommuneCmn() {
return this.trCommuneCmn;
}
public void setTrCommuneCmn(TrCommuneCmn trCommuneCmn) {
this.trCommuneCmn = trCommuneCmn;
}
@Column(name = "etu_adresse", nullable = false, length = 100)
@NotNull
@Length(max = 100)
public String getEtuAdresse() {
return this.etuAdresse;
}
public void setEtuAdresse(String etuAdresse) {
this.etuAdresse = etuAdresse;
}
@Column(name = "etu_code_postal", nullable = false, columnDefinition = "char", length = 5)
@NotNull
@Length(max = 5)
public String getEtuCodePostal() {
return this.etuCodePostal;
}
public void setEtuCodePostal(String etuCodePostal) {
this.etuCodePostal = etuCodePostal;
}
@Temporal(TemporalType.DATE)
@Column(name = "etu_date_naissance", nullable = false, length = 10)
@NotNull
public Date getEtuDateNaissance() {
return this.etuDateNaissance;
}
public void setEtuDateNaissance(Date etuDateNaissance) {
this.etuDateNaissance = etuDateNaissance;
}
} |
Suite à cette discussion, il a été un peu trafiqué à cause de l'héritage qui n'a pas été détecté par Hibernate lors de la génération par Seam Generate Entities puisqu'il s'agit d'une BDD MySQL dans laquelle il n'existe aucune instruction claire indiquant l'héritage des tables, les clés étrangères sur les identifiants n'étant pas suffisants.
Les valeurs dans la table de la BDD sont correctes quant aux définitions de l'entité donc je ne vois pas ce qui cloche.
Il y a un moyen de détecter plus précisément la cause de cette erreur de validation ?