@CreationTimestamp
使用该注解可以让Hibernate在插入时针对注解的属性对应的日期类型创建默认值。
/**
* Marks a property as the creation timestamp of the containing entity. The property value will be set to the current
* VM date exactly once when saving the owning entity for the first time.
* <p>
* Supported property types:
* <ul>
* <li>{@link java.util.Date}</li>
* <li>{@link java.util.Calendar}</li>
* <li>{@link java.sql.Date}</li>
* <li>{@link java.sql.Time}</li>
* <li>{@link java.sql.Timestamp}</li>
* <li>{@link java.time.Instant}</li>
* <li>{@link java.time.LocalDate}</li>
* <li>{@link java.time.LocalDateTime}</li>
* <li>{@link java.time.LocalTime}</li>
* <li>{@link java.time.MonthDay}</li>
* <li>{@link java.time.OffsetDateTime}</li>
* <li>{@link java.time.OffsetTime}</li>
* <li>{@link java.time.Year}</li>
* <li>{@link java.time.YearMonth}</li>
* <li>{@link java.time.ZonedDateTime}</li>
* </ul>
*
* @author Gunnar Morling
*/
@ValueGenerationType(generatedBy = CreationTimestampGeneration.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface CreationTimestamp {
}
@UpdateTimestamp
使用该注解可以让Hibernate在更新时时针对注解的属性对应的日期类型创建默认值。
/**
* Marks a property as the update timestamp of the containing entity. The property value will be set to the current VM
* date whenever the owning entity is updated.
* <p>
* Supported property types:
* <ul>
* <li>{@link java.util.Date}</li>
* <li>{@link java.util.Calendar}</li>
* <li>{@link java.sql.Date}</li>
* <li>{@link java.sql.Time}</li>
* <li>{@link java.sql.Timestamp}</li>
* <li>{@link java.time.Instant}</li>
* <li>{@link java.time.LocalDate}</li>
* <li>{@link java.time.LocalDateTime}</li>
* <li>{@link java.time.LocalTime}</li>
* <li>{@link java.time.MonthDay}</li>
* <li>{@link java.time.OffsetDateTime}</li>
* <li>{@link java.time.OffsetTime}</li>
* <li>{@link java.time.Year}</li>
* <li>{@link java.time.YearMonth}</li>
* <li>{@link java.time.ZonedDateTime}</li>
* </ul>
*
* @author Gunnar Morling
*/
@ValueGenerationType(generatedBy = UpdateTimestampGeneration.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface UpdateTimestamp {
}
自定义默认值注解
比如,用户名,插入时可以根据当前线程直接获取,然后利用注解赋值,这样在业务处理时就可以不用关注该属性。类似还有更新时自动赋值操作人等。
- 新增注解@CreationUser
/**
* Hibernate新增插入时自动填充
*/
@ValueGenerationType(
generatedBy = CreationUserGeneration.class
)
@Retention(RetentionPolicy.RUNTIME)
public @interface CreationUser {
}
- 新增注解值生成类
主要继承org.hibernate.tuple.AnnotationValueGeneration<A extends Annotation>
import org.hibernate.tuple.AnnotationValueGeneration;
import org.hibernate.tuple.GenerationTiming;
import org.hibernate.tuple.ValueGenerator;
/**
* 针对加了注解{@link @CreationUser}的属性在插入时,自动根据当前线程获取用户信息赋值
*
* @author zhuyuan 2019-11-23 08:33:47
*/
public class CreationUserGeneration implements AnnotationValueGeneration<CreationUser> {
private ValueGenerator<?> generator;
public CreationUserGeneration() {
}
@Override
public void initialize(CreationUser annotation, Class<?> propertyType) {
this.generator = (ValueGenerator<Object>) (session, o) -> UserContextHolder.getUserName();
}
@Override
public GenerationTiming getGenerationTiming() {
//只有插入时
return GenerationTiming.INSERT;
}
@Override
public ValueGenerator<?> getValueGenerator() {
return this.generator;
}
@Override
public boolean referenceColumnInSql() {
return false;
}
@Override
public String getDatabaseGeneratedReferencedColumnValue() {
return null;
}
}
就这样就OK了,注解@CreationUser就可以直接在实体类使用了。