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)

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();
		       }
		}
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
 
@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 :
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);
...
...
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
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);
...
...
Là je n'ai aucun enregistrement d'effectué.

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

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

...
...
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.

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 :
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
On enregistre bien InfoCompte, mais la transaction est annulé ensuite.
L'erreur viens donc de :
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);
compteGet récupère bien la donnée voulu.

Qu'en pensez vous ?