Trabe ya no escribe aquí. Puedes encontrarnos en nuestra publicación en Medium: medium.com/trabe.

4Trabes Historias de una empresa en 100 metros cuadrados

El blog de Trabe Soluciones

Timestamps automáticos para los modelos de Play

| | Comentarios

Una de las cosas a las que me he acostumbrado al trabajar con Rails es al mantenimiento automático de timestamps (a saber, fecha de creación y fecha de actualización). El framework Play no tiene nada del estilo, así que aquí os dejo la clasecilla que usamos nosotros para obtener este comportamiento. Con sólo dejarla en app/models todos los modelos tendrán los atributos createdAt y updatedAt y sus valores se actualizarán automáticamente. A nosotros nos gusta así, pero podéis afinar el comportamiento a vuestro gusto.

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
package models;

import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;

@MappedSuperclass
public class Model extends play.db.jpa.Model {

    public Date createdAt;

    public Date updatedAt;

    @PrePersist
    void onPrePersist() {
        if (this.createdAt == null) {
            this.createdAt = new Date();
        }
        this.updatedAt = this.createdAt;
    }

    @PreUpdate
    void onPreUpdate() {
        this.updatedAt = new Date();
    }
}


Lo sentimos, pero los comentarios están cerrados

Se nota la inspiración :)

Un “invento” muy útil sin duda. Eso sí, ten cuidado con las limitaciones de JPA (que no sé si podría ser el caso porque no conozco nada de Play, pero por si las moscas…): https://www.jfire.org/modules/phpwiki/index.php/Why%20not%20JPA#incompleteLifecycleEvents

Bien el uso de JPA, el único problema es cuando te topas con GAE, ahí si o si te pones a hacer tus propias librerías o utilizas Siena. De momento es la única limitación que he encontrado con JPA en play y solo sobre GAE.

Un poco de refactor en el método onPrePersist:
this.createdAt = this.createdAt == null ? new Date() : ;

¿Qué os parece?