I am trying to run a simple example as below but getting an error.
I am using @CreatedDate. However, when I save Student object using a Rest endpoint, it does not create a date and throws the given exception.
In my Rest end point, I have
@PostMapping("/students")
public Student createStudent(@Valid @RequestBody Student student){
return studentRepository.save(student);
}
Here is my entity...
@Entity
@Table(name = "students")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
public class Student implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotBlank
private String name;
@NotBlank
private String surname;
@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date createdAt;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updatedAt;
Error:
2018-06-20 21:43:40.821 DEBUG 8844 --- [nio-8080-exec-1] org.hibernate.SQL
: select next_val as id_val from hibernate_sequence for update
2018-06-20 21:43:40.874 DEBUG 8844 --- [nio-8080-exec-1] org.hibernate.SQL : update hibernate_sequence set next_val= ? where next_val=?
2018-06-20 21:43:40.971 DEBUG 8844 --- [nio-8080-exec-1] org.hibernate.SQL : insert into students (created_at, name, surname, updated_at, id) values (?, ?, ?, ?, ?)
2018-06-20 21:43:40.978 TRACE 8844 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [TIMESTAMP] - [null]
2018-06-20 21:43:40.979 TRACE 8844 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as [VARCHAR] - [Shilpa]
2018-06-20 21:43:40.980 TRACE 8844 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [VARCHAR] - [Manware]
2018-06-20 21:43:40.980 TRACE 8844 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [TIMESTAMP] - [null]
2018-06-20 21:43:40.981 TRACE 8844 --- [nio-8080-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as [BIGINT] - [3]
2018-06-20 21:43:41.003 WARN 8844 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000
2018-06-20 21:43:41.003 ERROR 8844 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'created_at' cannot be null
2018-06-20 21:43:41.006 INFO 8844 --- [nio-8080-exec-1] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements
2018-06-20 21:43:41.009 ERROR 8844 --- [nio-8080-exec-1] o.h.i.ExceptionMapperStandardImpl : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
2018-06-20 21:43:41.041 ERROR 8844 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'created_at' cannot be null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_112]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_112]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_112]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_112]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) ~[mysql-connector-java-5.1.45.jar:5.1.45]
When I assign the ID in the constructor manually, the annotation @CreatedDate is not working. The reason is, that in class IsNewAwareAuditingHandler the strategy.isNew (object) is false and so directly at creation time the markModified (object); is executed instead of markCreated (object);.
Now talking about Spring Annotation, Spring Annotations are a form of metadata that provides data about a program. Annotations are used to provide supplemental information about a program. It does not have a direct effect on the operation of the code they annotate.
As you can see above I have used @CreatedBy, @CreatedDate, @LastModifiedBy and @LastModifiedDate annotation on respective fields. Spring Data JPA approach abstracts working with JPA callbacks and provides us these fancy annotations to automatically save and update auditing entities.
Spring Data Mongo Annotations Spring Data makes working with MongoDB much easier. In the next sections, we'll explore the most basic features of Spring Data MongoDB. For more information, please visit our article about Spring Data MongoDB. 4.1. @Document This annotation marks a class as being a domain object that we want to persist to the database:
You probably miss @EnableJpaAuditing annotation in Configuration class which enable auditing in Spring JPA.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With