要在我的对象上创建更新时间戳,这是由数据库而不是我的Java程序生成的,我使用标记为@ValueGenerationType的自定义注释,generateBy类具有ALWAYS GenerationTiming。我的注释和值生成类几乎是the documentation中的那些副本,除了我尝试使用
GenerationTiming.ALWAYS而不是GenerationTiming.INSERT。 但是,我的时间戳似乎是在插入时创建的,但从未更新过。将hibernate.show_sql设置为true时,我可以看到在插入时调用current_timestamp但在更新时没有调用(在生成的sql中完全忽略相应的字段以进行更新)。
我使用StatelessSession进行插入/更新。插入时,我必须手动刷新以查看对象的时间戳,但更新时,任何数量的刷新都不会更改时间戳未更新的事实。 我是否遗漏了有关GenerationTiming.ALWAYS含义的内容?是否有更多的自定义注释添加到我的字段以使其更新?
注意:使用Hibernate的 4.3.11 或 5.1.0 版本的问题是相同的。我使用SQLServer2012Dialect连接到Microsoft Azure SQL数据库。
代码示例: 我的持久化对象包含一个时间戳字段:
@Temporal(TemporalType.TIMESTAMP)
@InDatabaseTimestamp
protected Date date;
我的InDatabaseTimestamp注释:
@ValueGenerationType(generatedBy = InDatabaseTimestampGeneration.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface InDatabaseTimestamp {}
我的InDatabaseTimestampGeneration类:
public class InDatabaseTimestampGeneration implements AnnotationValueGeneration<InDatabaseTimestamp> {
@Override
public GenerationTiming getGenerationTiming() {
return GenerationTiming.ALWAYS;
}
@Override
public ValueGenerator<?> getValueGenerator() {
// no in-memory generation
return null;
}
@Override
public boolean referenceColumnInSql() {
return true;
}
@Override
public String getDatabaseGeneratedReferencedColumnValue() {
return "current_timestamp";
}
@Override
public void initialize(InDatabaseTimestamp annotation, Class<?> propertyType) {
// do nothing
}
}
答案 0 :(得分:-3)
您似乎可以尝试在下面注释您的媒体资源date
。
@Temporal(TemporalType.TIMESTAMP)
@Generated(GenerationTime.ALWAYS)
@Column(insertable = false, updatable = false)
public Date date;
希望它有所帮助。