Bonjour.
Je travaille actuellement sur un projet d'e-commerce et je rencontre une difficulté que je n'arrive pas à résoudre.
Cela se produit lorsque le client a rempli son panier et décide donc de se rendre sur la page de commande pour y rentrer ses informations personnelles. Il est invité à rentrer son nom, prénom, email, téléphone, adresse et numéro de carte de crédit.
Lorsque je veux persister mon entité client (qui contient ces informations et qui est mappée à ma BDD), j'obtiens une ConstraintViolationException (j'ai pu voir ça grâce au débuggage).
- La table client dans ma BDD :
- Mon entité Client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 id int(10) UNSIGNED Non-null AUTO_INCREMENT nom varchar(30) latin1_swedish_ci Non-null prenom varchar(20) latin1_swedish_ci Non-null email varchar(45) latin1_swedish_ci Non-null tel varchar(30) latin1_swedish_ci Non-null addresse varchar(45) latin1_swedish_ci Non-null no_carte varchar(20) latin1_swedish_ci Non-null- Mon ejb GestionCommande :
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 package entites; import java.io.Serializable; import java.util.Collection; import javax.persistence.Basic; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Entity @Table(name = "client") @NamedQueries({ @NamedQuery(name = "Client.findAll", query = "SELECT c FROM Client c"), @NamedQuery(name = "Client.findById", query = "SELECT c FROM Client c WHERE c.id = :id"), @NamedQuery(name = "Client.findByNom", query = "SELECT c FROM Client c WHERE c.nom = :nom"), @NamedQuery(name = "Client.findByPrenom", query = "SELECT c FROM Client c WHERE c.prenom = :prenom"), @NamedQuery(name = "Client.findByEmail", query = "SELECT c FROM Client c WHERE c.email = :email"), @NamedQuery(name = "Client.findByTel", query = "SELECT c FROM Client c WHERE c.tel = :tel"), @NamedQuery(name = "Client.findByAddresse", query = "SELECT c FROM Client c WHERE c.addresse = :addresse"), @NamedQuery(name = "Client.findByNoCarte", query = "SELECT c FROM Client c WHERE c.noCarte = :noCarte")}) public class Client implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @NotNull @Column(name = "id") private Integer id; @Basic(optional = false) @NotNull @Size(min = 1, max = 30) @Column(name = "nom") private String nom; @Basic(optional = false) @NotNull @Size(min = 1, max = 20) @Column(name = "prenom") private String prenom; // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation @Basic(optional = false) @NotNull @Size(min = 1, max = 45) @Column(name = "email") private String email; @Basic(optional = false) @NotNull @Size(min = 1, max = 30) @Column(name = "tel") private String tel; @Basic(optional = false) @NotNull @Size(min = 1, max = 45) @Column(name = "addresse") private String addresse; @Basic(optional = false) @NotNull @Size(min = 1, max = 20) @Column(name = "no_carte") private String noCarte; @OneToMany(cascade = CascadeType.ALL, mappedBy = "idClient") private Collection<CommandeClient> commandeClientCollection; public Client() { } public Client(Integer id) { this.id = id; } public Client(Integer id, String nom, String prenom, String email, String tel, String addresse, String noCarte) { this.id = id; this.nom = nom; this.prenom = prenom; this.email = email; this.tel = tel; this.addresse = addresse; this.noCarte = noCarte; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddresse() { return addresse; } public void setAddresse(String addresse) { this.addresse = addresse; } public String getNoCarte() { return noCarte; } public void setNoCarte(String noCarte) { this.noCarte = noCarte; } public Collection<CommandeClient> getCommandeClientCollection() { return commandeClientCollection; } public void setCommandeClientCollection(Collection<CommandeClient> commandeClientCollection) { this.commandeClientCollection = commandeClientCollection; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { // TODO: Warning - this method won't work in the case the id fields are not set if (!(object instanceof Client)) { return false; } Client other = (Client) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "entites.Client[ id=" + id + " ]"; } }L'erreur se produit à la ligne 47, pour la méthode ajouterClient.
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 package ejb; import entites.Client; import entites.CommandeClient; import entites.Produit; import entites.ProduitCommande; import entites.ProduitCommandePK; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ejb.SessionContext; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagementType; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import pannier.Pannier; import pannier.ProduitPannier; @Stateless @TransactionManagement(TransactionManagementType.CONTAINER) public class GestionCommandes { @PersistenceContext(unitName = "SunShopPU") private EntityManager em; @Resource private SessionContext contexte; @EJB private ProduitFacade produitFacade; @EJB private CommandeClientFacade commandeClientFacade; @EJB private ProduitCommandeFacade produitCommandeFacade; @TransactionAttribute(TransactionAttributeType.REQUIRED) public int ajouterCommande(String nom, String prenom, String email, String tel, String adresse, String numcarte, Pannier pannier) { try { Client client = ajouterClient(nom, prenom, email, tel, adresse, numcarte); CommandeClient commande = ajouterCommande(client, pannier); ajouterProduitsCommandes(commande, pannier); return commande.getId(); } catch (Exception e) { contexte.setRollbackOnly(); return 0; } } private Client ajouterClient(String nom, String prenom, String email, String tel, String adresse, String numcarte) { Client client = new Client(); // si je décommente la ligne du dessous ça fonctionne // client.setId(1); client.setNom(nom); client.setPrenom(prenom); client.setEmail(email); client.setTel(tel); client.setAddresse(adresse); client.setNoCarte(numcarte); em.persist(client); return client; } private CommandeClient ajouterCommande(Client client, Pannier pannier) { CommandeClient commande = new CommandeClient(); //commande.setId(1); commande.setIdClient(client); commande.setMontant(BigDecimal.valueOf(pannier.getTotal())); // on crée un numéro de confirmation Random alea = new Random(); int i = alea.nextInt(999999999); commande.setNoConfirmation(i); em.persist(commande); return commande; } private void ajouterProduitsCommandes(CommandeClient commande, Pannier pannier) { em.flush(); List<ProduitPannier> produits = pannier.getProduits(); // on boucle sur le pannier pour créer les produits commandés for (ProduitPannier ppProd : produits) { int idProduit = ppProd.getProduit().getId(); ProduitCommandePK pcPK = new ProduitCommandePK(); pcPK.setIdCommandeClient(commande.getId()); pcPK.setIdProduit(idProduit); // on crée un produit commandé grâce à ProduitCommandePK ProduitCommande prodCommande = new ProduitCommande(pcPK); // on set la quantité prodCommande.setQuantite(ppProd.getQuantite()); em.persist(prodCommande); } } public Map getDetailsCommande(int idCommande) { Map mapCommande = new HashMap(); // on récupère la commande CommandeClient commande = commandeClientFacade.find(idCommande); // on récupère le client Client client = commande.getIdClient(); // on récupère tous les produits commandés List<ProduitCommande> produitsCommandes = produitCommandeFacade.findByIdCommande(idCommande); // on récupère les détails de ces derniers List<Produit> produits = new ArrayList<Produit>(); for (ProduitCommande op : produitsCommandes) { Produit p = (Produit) produitFacade.find(op.getProduitCommandePK().getIdProduit()); produits.add(p); } // on ajoute le tout dans la map mapCommande.put("recordCommande", commande); mapCommande.put("client", client); mapCommande.put("produitsCommandes", produitsCommandes); mapCommande.put("produits", produits); return mapCommande; } }
Toutes les informations sont bien "setées" mais à la ligne 71, au moment du persist, une exception est levée et le RollBack ligne 54 est effectué. Ce qui est bizarre, c'est que si je set l'id moi-même, cela fonctionne correctement (pourtant il est bien en identity).
Enfin bref, je n'y comprends pas grand chose et j'ai déjà perdu beaucoup de temps à cause de cela...
Merci d'avance à ceux qui auront le temps de jeter un coup d'oeil.
Partager