Modélisation persistence persist
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:
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:
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:
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:
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:
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:
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:
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:
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 ?