Bonjour à vous tous ; ) !
Le titre est assez étrange mais difficile à qualifier ma demande.
Je spécifie d'emblée l'environnement. Spring/Jpa/Hibernate/postGresql
J'effectue des insertions dans ma base de donnée transitant par JPA et des entity. Le processus fonctionne, comme présenté ci-dessous.
Je créé un compte (Compte) qui est caractérisé par des informations autres (InfoCompte)
Mes annotations associant un "Compte" à "InfoCompte". relation 1-1
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 em = getEntityManagerFactory().createEntityManager(); tx = em.getTransaction(); tx.begin(); String ipUser = java.net.InetAddress.getLocalHost().getHostAddress(); Date date = new Date(); Compte compte = new Compte(); compte.setEmail(email); compte.setPwd(pwd); compte.setIp(ipUser); compte.setNbOffre(0); compte.setDateInscription(date); em.persist(compte); InfoCompte infoCompte = new InfoCompte(nameUser, familyNameUser, title, null, "", "", phoneNumber); em.persist(infoCompte); compte.setInfoCompte(infoCompte); infoCompte.setCompte(compte); tx.commit(); }catch(PersistenceException e) { System.out.println(e); tx.rollback(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if (em != null) { em.close(); } }
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 @Entity InfoCompte ... ... @OneToOne(mappedBy="infoCompte", cascade=CascadeType.ALL, targetEntity=Compte.class) private Compte compte; @Entity Compte ... ... @OneToOne @JoinColumn(name="info_compte_id", referencedColumnName="id") private InfoCompte infoCompte;
Ce que j'ai crut comprendre, c'est que dès lors qu'une donné est persisté, il n'y a pas besoin de ré-utiliser des persist(), pour enregistrer des donnée en base.
Exemple :
Pour moi, le code suivant devrait marché, étant dans la même transaction, mais ce n'est le cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ... ... em.persist(compte); InfoCompte infoCompte = new InfoCompte(nameUser, familyNameUser, title, null, "", "", phoneNumber); em.persist(infoCompte); compte.setInfoCompte(infoCompte); infoCompte.setCompte(compte); ... ...
Là je n'ai aucun enregistrement d'effectué.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ... ... em.persist(compte); InfoCompte infoCompte = new InfoCompte(nameUser, familyNameUser, title, null, "", "", phoneNumber); List li = compteDAO.getCompteByEmail(email); Compte compteGet = (Compte)li.get(0); compteGet.setInfoCompte(infoCompte); infoCompte.setCompte(compteGet); ... ...
Je me dit normal, la transaction n'est effectué et "Compte" n'est pas encore créé, alors je ne peut le récupérer. Donc la transaction est annulé.
Je sépare les transactions alors
Ici, seul Compte est enregistré. Hors, je récupère bien dans ma liste "li" mon compte précédemment créé. Mais InfoCompte n'est présente 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
15
16
17
18
19
20
21
22 tx.begin ... ... em.persist(compte); tx.commit(); tx.begin(); InfoCompte infoCompte = new InfoCompte(nameUser, familyNameUser, title, null, "", "", phoneNumber); List li = compteDAO.getCompteByEmail(email); Compte compteGet = (Compte)li.get(0); compteGet.setInfoCompte(infoCompte); infoCompte.setCompte(compteGet); tx.commit ... ...
Erreur de relation @OneToOne ? Je ne vois pas non.
Je veux éviter de mettre des persist à tout bout de champs.
Ajouter une donné en relation à une donnée déjà en base, devrait l'enregistré aussi non ?
Si je rajoute le persist
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 tx.begin ... ... em.persist(compte); tx.commit(); tx.begin(); InfoCompte infoCompte = new InfoCompte(nameUser, familyNameUser, title, null, "", "", phoneNumber); List li = compteDAO.getCompteByEmail(email); em.persist(infoCompte); Compte compteGet = (Compte)li.get(0); compteGet.setInfoCompte(infoCompte); infoCompte.setCompte(compteGet); tx.commit ... ...
J'ai une erreur d'insertion, dut à la relation si je comprends bien ceci :
On enregistre bien InfoCompte, mais la transaction est annulé ensuite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Hibernate: insert into public.compte_info_compte (domain_activity_id, familyNameUser, nameUser, phone_number, register_complet, title, userDescription, yearsOld) values (?, ?, ?, ?, ?, ?, ?, ?) javax.persistence.RollbackException: Error while committing the transaction
L'erreur viens donc de :
compteGet récupère bien la donnée voulu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Compte compteGet = (Compte)li.get(0); compteGet.setInfoCompte(infoCompte); infoCompte.setCompte(compteGet);
Qu'en pensez vous ?
Partager