@Entity(name = "Event") public static class Event { @Id @GeneratedValue private Long id; @Column(name = "`timestamp`") @FunctionCreationTimestamp private Date timestamp; //Constructors, getters, and setters are omitted for brevity } @ValueGenerationType(generatedBy = FunctionCreationValueGeneration.class) @Retention(RetentionPolicy.RUNTIME) public @interface FunctionCreationTimestamp {} // DB를 통해 자동생성 지원 public static class FunctionCreationValueGeneration implements AnnotationValueGeneration<FunctionCreationTimestamp> { @Override public void initialize(FunctionCreationTimestamp annotation, Class<?> propertyType) { } /** * Generate value on INSERT * @return when to generate the value */ public GenerationTiming getGenerationTiming() { return GenerationTiming.INSERT; } /** * Returns null because the value is generated by the database. * @return null */ public ValueGenerator<?> getValueGenerator() { return null; } /** * Returns true because the value is generated by the database. * @return true */ public boolean referenceColumnInSql() { return true; } /** * Returns the database-generated value * @return database-generated value */ public String getDatabaseGeneratedReferencedColumnValue() { return "current_timestamp"; } }
쿼리가 아래처럼 실행된다.
INSERT INTO Event ("timestamp", id) VALUES (CURRENT_TIMESTAMP, 1)
// In memory 상에서 자동생성 public static class FunctionCreationValueGeneration implements AnnotationValueGeneration<FunctionCreationTimestamp> { @Override public void initialize(FunctionCreationTimestamp annotation, Class<?> propertyType) { } /** * Generate value on INSERT * @return when to generate the value */ public GenerationTiming getGenerationTiming() { return GenerationTiming.INSERT; } /** * Returns the in-memory generated value * @return {@code true} */ public ValueGenerator<?> getValueGenerator() { return (session, owner) -> new Date( ); } /** * Returns false because the value is generated by the database. * @return false */ public boolean referenceColumnInSql() { return false; } /** * Returns null because the value is generated in-memory. * @return null */ public String getDatabaseGeneratedReferencedColumnValue() { return null; } }
쿼리가 다음과 같이 날라간다.
INSERT INTO Event ("timestamp", id) VALUES ('Tue Mar 01 10:58:18 EET 2016', 1)