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
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 .