Bonjour,
J'ai une classe DepenseBeneficiaire.java, avec une clef compos�e d'attributs provenant d'une classe DepenseBeneficiaireId.java. Parmi ces attributs de DepenseBeneficiaireId se trouve une �num�ration permettant de d�terminer le type de d�pense.
Ma classe se sauvegarde en base sans probl�me, mais la relecture bloque au moment o� il faut matcher depense_id (champ de ma BDD) avec l'enum NatureDepense.
DepenseBeneficiaire.java
et DepenseBeneficiaireId.java
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 @Entity @Table(name="dep_beneficiaire") public class DepenseBeneficiaire implements Serializable { private static final long serialVersionUID = 3872180192633198521L; public static final String FIELD_IDBENEFICIAIRE = "identifier"; public static final String FIELD_BENEFICIAIRE = "beneficiaire"; private DepenseBeneficiaireId identifier; @EmbeddedId @AssociationOverrides ({ @AssociationOverride ( name="beneficiaire", joinColumns= { @JoinColumn(name="dossier_id", referencedColumnName="dossier_id"), @JoinColumn(name="action_id", referencedColumnName="action_id"), @JoinColumn(name="beneficiaire_id", referencedColumnName="id") } ), @AssociationOverride ( name="depense_id", joinColumns= { @JoinColumn(name="depense_id", referencedColumnName="depense_id") } ) }) public DepenseBeneficiaireId getIdentifier() { return identifier; } public void setIdentifier(DepenseBeneficiaireId identifier) { this.identifier = identifier; } @ManyToOne @JoinColumns ({ @JoinColumn(name="dossier_id", referencedColumnName="dossier_id", insertable=false, updatable=false), @JoinColumn(name="action_id", referencedColumnName="action_id", insertable=false, updatable=false), @JoinColumn(name="beneficiaire_id", referencedColumnName="id", insertable=false, updatable=false) }) public Beneficiaire getBeneficiaire() { return identifier.getBeneficiaire(); } public void setBeneficiaire(Beneficiaire beneficiaire) { identifier.setBeneficiaire(beneficiaire); if(beneficiaire.getAdherent_Id() != null) setBeneficiaire_type("A"); if(beneficiaire.getFournisseur_Id() != null) setBeneficiaire_type("F"); if(beneficiaire.getOrganisme_Id() != null) setBeneficiaire_type("O"); if(beneficiaire.getStagiaire_Id() != null) setBeneficiaire_type("S"); } @Column(name="depense_id", length=3, insertable=false, updatable=false) public NatureDepense getDepense_id() { return identifier.getDepense_id(); } public void setDepense_id(NatureDepense depense_id) { this.identifier.setDepense_id(depense_id); } public DepenseBeneficiaire() { identifier = new DepenseBeneficiaireId(); } public DepenseBeneficiaire(NatureDepense natureDepense) { this(); setDepense_id(natureDepense); } @Override public boolean equals(Object obj) { if(!(obj instanceof DepenseBeneficiaire)) return false; DepenseBeneficiaire depenseBeneficiaire = (DepenseBeneficiaire)obj; return new EqualsBuilder() .append(depenseBeneficiaire.getIdentifier(), getIdentifier()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(getIdentifier()) .toHashCode(); } }
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 @Embeddable public class DepenseBeneficiaireId implements Serializable { public enum NatureDepense { REMUNERATION ("01", "REMUNERATION"), FORMATION ("03", "FORMATION"), REPAS ("07", "REPAS"), HEBERGEMENTREPAS ("08", "HEBERGEMENT ET REPAS"), TRANSPORT ("09", "TRANSPORT"), DIVERS ("10", "DIVERS"), REMUNERATIONHTT ("16", "REMUNERATION HTT"), ALLOCATIONFORMATION ("17", "ALLOCATION FORMATION"), LOCATIONSALLE ("18", "LOCATION SALLE"), LOCATIONMATERIEL ("19", "LOCATION MATERIEL"); private String identifier; private String libelle; public String getIdentifier() { return identifier; } public String getLibelle() { return libelle; } private NatureDepense(String identifier, String libelle) { this.identifier = identifier; this.libelle = libelle; } public static NatureDepense value(String identifier) { NatureDepense result = null; for(NatureDepense natureDepense: values()) { if(natureDepense.getIdentifier().equals(identifier)) { result = natureDepense; break; } } return result; } } private static final long serialVersionUID = -4762088849677965696L; public static final String FIELD_BENEFICIAIRE = "beneficiaire"; private Beneficiaire beneficiaire; private NatureDepense depense_id; @Type ( type="fr.site.hibernate.utils.GenericEnumUserType", parameters= { @Parameter(name="enumClassName", value="fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense"), @Parameter(name="valueOfMethod", value="value") } ) public NatureDepense getDepense_id() { return depense_id; } public void setDepense_id(NatureDepense depense_id) { this.depense_id = depense_id; } @ManyToOne public Beneficiaire getBeneficiaire() { return beneficiaire; } public void setBeneficiaire(Beneficiaire beneficiaire) { this.beneficiaire = beneficiaire; } @Override public boolean equals(Object obj) { if(!(obj instanceof DepenseBeneficiaireId)) return false; DepenseBeneficiaireId id = (DepenseBeneficiaireId)obj; return new EqualsBuilder() .append(id.getBeneficiaire().getId(), getBeneficiaire().getId()) .append(id.getDepense_id().getIdentifier(), getDepense_id().getIdentifier()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(getBeneficiaire().getId()) .append(getDepense_id().getIdentifier()) .toHashCode(); } }
J'obtiens l'exception suivante :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 java.lang.IllegalArgumentException: Unknown name value for enum class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense: 16 [...] Caused by: java.lang.IllegalArgumentException: No enum const class fr.site.hibernate.classes.DepenseBeneficiaireId$NatureDepense.16
Je vois bien qu'Hibernate essaie de charger la constante NatureDepense.16 qui n'existe pas, mais la fonction public static NatureDepense value(String identifier) devrait pallier � ce probl�me, non ? En tout cas, je sais qu'Hibernate passe dans cette fonction et trouve bien une NatureDepense matchant le String mis en param�tre.
Je ne sais pas si c'est li� au fait que mon identifier soit de type String (je n'ai pas conserv� l'EnumType par d�faut), ou s'il me manque une annotation (j'ai essay� de mettre @Enumerated(EnumType.STRING), sans r�sultat), ou si je dois surcharger une m�thode dans mon enum : une id�e ?
Partager