Duplicate entry avec save()
Bonjour !
Je réalise actuellement une petite application JEE avec Hibernate, histoire de me familiariser avec ce dernier ... et apparemment c'est pas gagné :P
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) :
Code:
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 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:
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
(?, ?, ?, ?) |
Et voici un 'résumé' (la partie qui nous intéresse quoi) de ma servlet utilisée pour écrire cette classe en base :
Code:
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); |
Ma fonction save() de HibernateTicket :
Code:
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(); }
}
}
} |
Et le contenu de mon fichier Ticket.hbm.xml :
Code:
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> |
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 ! ;)
Merci d'avance !