Cómo anotate el atributo en la entidad si el atributo de tabla tiene un valor predeterminado de clock_timestamp ()?

Vape:

En la base de datos PostgreSQL, tengo una tabla con el atributo "insert_time" (timestamptz), que tiene un valor por defecto de la función clock_timestamp ().

En Java, he creado la Entidad de la mesa, pero cuando me gusta para insertar un nuevo registro en la tabla de la insert_time tiene un valor de null en lugar de clock_timestamp ().

Cómo anotar correctamente la Entidad por lo que si el insert_time no se pasa en Java que un "valor por defecto" de clock_timestamp () se utiliza en una tabla en sí?

o cómo leer clock_timestamp () en la entidad si el atributo se establece en nulo.

Gracias

Vladucu Voican:

No se puede simplemente anotada la entidad JPA y obtener el valor devuelto por la función clock_timestamp()

Con el fin de conseguir que el valor a su código que tendrá que hacer una consulta

SELECT clock_timestamp();

Pero se puede usar JPA-oyentes para lograr algo similar:

public class TimestampEntityListener {
    @PrePersist
    public void setDefaultTime(BaseEntity entity) {
       if(entity.getInsertTime() == null) {
           entity.setInsertTime(new Timestamp((new Date()).getTime())):
       }
    }
}

@MappedSuperclass
@EntityListeners({TimestampEntityListener.class})
public abstract class BaseEntity {...}

Ahora, si usted está realmente interesado en tener el control de la base de datos el momento de la inserción, y no delegar su aplicación para hacerlo, puede modificar el código anterior y cablear un EntityManager en él para que pueda realizar y que seleccione contra el PP y acaba de establecer que el valor directamente.

Actualización: sobre cómo delegar la entityListener para consultar la base de datos

public class TimestampEntityListener {
        @Autowired
        EntityManager entityManager;

        @PrePersist
        public void setDefaultTime(BaseEntity entity) {
           AutowireHelper.autowire(this, this.entityManager);
           if(entity.getInsertTime() == null) {
               Timestamp timestamp = (Timestamp)entityManager.createNativeQuery("select clock_timestamp()").getSingleResult();
               entity.setInsertTime(timestamp):
           }
        }
    }

Se puede utilizar esta clase para AutowireHelper y con el código anterior debería funcionar fuera de la caja, siempre y cuando sus entidades ampliarán el BaseEntity .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=364345&siteId=1
Recomendado
Clasificación