Bonjour !
Je réalise actuellement une petite application JEE avec Hibernate, histoire de me familiariser avec ce dernier ... et apparemment c'est pas gagné
J'ai donc 2 classes/tables : une classe User, avec une adresse mail comme identifiant, et quelques autres propriétés, et une classe Ticket, avec un identifiant 'classique' entier, quelques propriétés et ... 2 Users (un vendeur -seller- et un acheteur -buyer-). Le problème arrive lorsque je veux sauvegarder un Ticket, avec un vendeur défini, dont je récupère l'adresse mail (son identifiant donc) dans ma session http (l'acheteur est à null) :
Et en effet, quand je regarde les requêtes, j'ai bien une nouvelle insertion d'un User, et c'est ça que je ne comprend pas, et que je n'arrive pas à résoudre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 WARN [JDBCExceptionReporter:100] SQL Error: 1062, SQLState: 23000 ERROR [JDBCExceptionReporter:101] Duplicate entry 'toto@nullmail.com' for key 'PRIMARY' ERROR [AbstractFlushingEventListener:324] Could not synchronize database state with session
Et voici un 'résumé' (la partie qui nous intéresse quoi) de ma servlet utilisée pour écrire cette classe en base :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Hibernate: insert into TICKET (DEPARTURECITY, ARRIVALCITY, DEPARTUREDATE, ARRIVALDATE, INITIALPRICE, FINALPRICE, VALIDITY, SELLER, BUYER, ISSOLD, PUBLISHDATE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into USER (FIRSTNAME, LASTNAME, PASSWORD, EMAIL) values (?, ?, ?, ?)
Ma fonction save() de HibernateTicket :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Ticket newTicket = new Ticket(); HttpSession session = request.getSession(); HibernateUser hu = new HibernateUser(); Object userEmail = session.getAttribute("userEmail"); newTicket.setSeller(hu.getByEmail(userEmail.toString())); HibernateTicket ht = new HibernateTicket(); ht.save(newTicket);
Et le contenu de mon fichier Ticket.hbm.xml :
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 public void save(Ticket ticket) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); //session.merge(ticket.getSeller()); session.persist(ticket); transaction.commit(); } catch (HibernateException he) { he.printStackTrace(); if(transaction != null) { try { transaction.rollback(); } catch(HibernateException he2) { he2.printStackTrace(); } } } finally { if(session != null) { try { session.close(); } catch(HibernateException he) { he.printStackTrace(); } } } }
Voilà, j'espère que j'ai mis tous les éléments nécessaires à la compréhension de mon problème, n'hésitez pas à me signaler s'il manque quelque chose, et si une âme charitable pourrait m'aider avec tout ça, je lui en serait infiniment reconnaissant !
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 <hibernate-mapping> <class name="model.Ticket" table="TICKET"> <id name="id" column="ID"> <generator class="identity"> </generator> </id> <property name="departureCity" column="DEPARTURECITY"/> <property name="arrivalCity" column="ARRIVALCITY"/> <property name="departureDate" column="DEPARTUREDATE"/> <property name="arrivalDate" column="ARRIVALDATE"/> <property name="initialPrice" column="INITIALPRICE"/> <property name="finalPrice" column="FINALPRICE"/> <property name="validity" column="VALIDITY"/> <many-to-one name="seller" class="model.User" column="SELLER" cascade="all"/> <many-to-one name="buyer" class="model.User" column="BUYER" cascade="all"/> <property name="isSold" column="ISSOLD"/> <property name="publishDate" column="PUBLISHDATE"/> </class> </hibernate-mapping>
Merci d'avance !
Partager