2009-11-17 4 views
11

Je joue un peu avec JPA (Eclipselink pour être précis). L'entité ci-dessous a un horodatage censé refléter chaque fois que cette entité a été mise à jour pour la dernière fois.Dernière mise à jour de l'horodatage avec JPA

Quelles sont les stratégies pour faire la mise à jour JPA cet horodatage automatiquement chaque fois que cette entité est modifiée?

Comment pourrais-je aller sur si je veux aussi un horodatage « de création », définissez uniquement lorsque l'entité est d'abord persisté, jamais permis à changer à nouveau?

@Entity 
public class Item implements Serializable { 
    private static final long serialVersionUID = 1L; 
    private Integer id; 
    private String note; 


    public Item() { 
    } 


    @Id 
    @GeneratedValue(strategy=SEQUENCE) 
    @Column(unique=true, nullable=false) 
    public Integer getId() { 
     return this.id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 


    @Column(length=255) 
    @Column(nullable=false) 
    public String getNote() { 
     return this.note; 
    } 

    public void setNote(String note) { 
     this.note = note; 
    } 

    @Column(nullable=false) 
    public Timestamp getUpdated() { 
     return this.updated; 
    } 

    public void setUpdated(Timestamp updated) { 
     this.updated = updated; 
    } 


} 

Répondre

16

Utilisez @PrePersist et @PreUpdate annotations et écrire votre propre écouteur d'événement.

Jetez un oeil à this answer pour plus de détails. Il est marqué comme Hibernate mais est applicable à tout fournisseur JPA.

1

si vous utilisez MySQL, je pense que vous pouvez faire ce qui suit pour désactiver les horodatages d'être mis à jour de l'entité

@Column(name = "lastUpdate", updatable= false, insertable=false) 
@Temporal(TemporalType.TIMESTAMP) 
private Date lastUpdate; 

pour oracle temps faut régler les horodateurs de l'entité en utilisant l'annotation @PreUpdate comme expliqué ci-dessus.

+0

Ceci est faux pour plusieurs raisons: (1) précède suppose que vous mettez à jour manuellement l'horodatage créant ainsi « actualisable » est inutile; (2) par conséquent, ce qui précède ne fonctionnera pas sans les auditeurs d'événements @PreUpdate/@PrePersist; (3) si vous voulez que la base de données génère vos horodatages (ce que vous semblez impliquer), vous devez marquer vos propriétés comme générées qui ne sont pas ** en norme JPA; (4) Enfin, MySQL ne vous laissera pas 2 timestamps mis à jour automatiquement dans la même table. – ChssPly76

+0

En ce qui concerne mysql, vous pouvez créer un ou plusieurs déclencheurs pour mettre à jour n'importe quel nombre de colonnes, comme un horodatage - vous n'êtes pas limité à 1 horodatage mis à jour automatiquement dans une table. – nos

+0

dans MySQL vous pouvez également créer une table avec 2 horodatages et insérer NULL sur les deux champs lors de l'insertion d'un enregistrement. créer une table ts ( last_updated_ts TIMESTAMP, created_ts TIMESTAMP, nom varchar (5)); insert dans ts (last_updated_ts, created_ts, name) valeur (null, null, 'test'); Le déclenchement ou l'annotation est certainement meilleur selon la façon dont le client accède à la base de données. – surajz

1

En fait, surajz des œuvres de réponse. Envisagez un scénario dans lequel vous effectuez le suivi de deux horodatages. Vous voulez les mettre à jour manuellement via l'entité. Vous devez en définir un à updateble=false (celui que vous ne voulez pas mettre à jour lorsque l'enregistrement est mis à jour), et laisser l'autre libre pour les mises à jour.

C'est ce qui a fonctionné pour moi.