Précédent   Forum des professionnels en informatique > Java > Général Java > Persistance > JPA
JPA Forum d'entraide sur l'API de persistance JPA (Java Persistence API)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/12/2011, 23h35   #1
Membre du Club
 
Inscription : mars 2002
Messages : 91
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 91
Points : 65
Points : 65
Par défaut Récupérer la GeneratedValue avant le persist pour mettre à jour un autre champ

Bonjour,

J'ai pris l'habitude (peut-être à tord) de générer des champs "code" de mes entity à partir du champs "id" avec le @PrePersist de la façon suivante :

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
39
40
41
42
43
@Entity
@SequenceGenerator(sequence="S_DOCUMENT",name="S_DOCUMENT")
@Table(name = "DOCUMENT")
public class Document {
  private long id;
  private String code;
  private String name;
 
  @Id
  @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="S_DOCUMENT")
  @Column(name = "DOC_ID", unique = true, nullable = false, insertable = false, updatable = false)
  public long getId() {
    return this.id;
  }
 
  public void setId(long id) {
    this.id = id;
  }
 
  @Column(name="DOC_CODE",nullable = false)
  public String getCode() {
    return this.code;
  }
 
  public void setCode(String code) {
    this.code= code;
  }
 
 
  @Column(name="DOC_NAME",nullable = false)
  public String getName() {
    return this.name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  @PrePersist
  public void myPrePersist() {
    setCode("DOC_"+getId());
  }
}
Ce code fonctionne très bien sous JBoss 4.2 avec PostgreSQL ou Oracle 9g/10g. En revanche, il ne fonctionne pas sous JBoss 5.1 avec Oracle 11g. Tous mes entity ont pour valeur du champ code "DOC_0".

En activant des logs, je me rends compte que le code Java exécuté par le @PrePersist est exécuté avant la récupération de la prochaine valeur de la séquence. Du coup, le champ "id" vaut toujours 0 lorsque la méthode myPrePresist() est exécutée.

Deux questions :
- Quel est le comportement normal ?
- Comment implémenter proprement ce que je souhaite faire ?

Merci pour votre aide !
__________________
Zero
My site : http://blog.lecacheur.com
GWhere project : http://www.gwhere.org
Debian Addict site : http://www.debianaddict.org
Zero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 05h51   #2
Expert Confirmé
 
Homme
Ingénieur développement logiciels
Inscription : juin 2007
Messages : 2 258
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juin 2007
Messages : 2 258
Points : 2 578
Points : 2 578
Au vu de ton code, un détail me choque, le champ "code" est un champ calculé, et vous avez dû voir dans votre formation qu'on ne devrait pas persister un champ calculé. Connaissant l'ID de ton enregistrement tu as facilement son code associé, alors pourquoi le persistes tu?
DevServlet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h43.


 
 
 
 
Partenaires

Hébergement Web