Hibernate @ValueGenerationType

Example

@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)