Hibernate:@ValueGenerationType在插入时应用但不是更新时间

时间:2016-04-18 17:05:36

标签: java hibernate azure

要在我的对象上创建更新时间戳,这是由数据库而不是我的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
  }
}

1 个答案:

答案 0 :(得分:-3)

您似乎可以尝试在下面注释您的媒体资源date

@Temporal(TemporalType.TIMESTAMP)
@Generated(GenerationTime.ALWAYS) 
@Column(insertable = false, updatable = false)
public Date date;

希望它有所帮助。