Java Hibernate:@ValueGenerationType在插入时应用,但在更新时未应用

Java Hibernate:@ValueGenerationType在插入时应用,但在更新时未应用,java,hibernate,azure,Java,Hibernate,Azure,为了在我的对象(由数据库而不是Java程序生成)上有一个更新时间戳,我使用了一个自定义注释,标记为@ValueGenerationType,generatedBy类对其有一个ALWAYS GenerationTiming。我的注释和值生成类几乎都是中的类的副本,除了我尝试使用的 GenerationTiming.ALWAYS而非GenerationTiming.INSERT。 但是,我的时间戳似乎是在插入时创建的,但从未更新。将hibernate.show_sql设置设置为true时,我可以看到

为了在我的对象(由数据库而不是Java程序生成)上有一个更新时间戳,我使用了一个自定义注释,标记为@ValueGenerationType,generatedBy类对其有一个ALWAYS GenerationTiming。我的注释和值生成类几乎都是中的类的副本,除了我尝试使用的

GenerationTiming.ALWAYS而非GenerationTiming.INSERT。 但是,我的时间戳似乎是在插入时创建的,但从未更新。将hibernate.show_sql设置设置为true时,我可以看到在插入时调用当前_时间戳,但在更新时不调用(在生成的sql for update中完全忽略相应字段)

我使用无状态会话进行插入/更新。插入时,我必须手动刷新以查看对象上的时间戳,但在更新时,任何次数的刷新都不会改变时间戳未更新的事实。 我是否错过了关于世代时间的意义,总是这样?在自定义注释的基础上,是否还有其他内容要添加到“我的字段”以使其更新

注意:使用Hibernate的4.3.115.1.0版本时,问题是相同的。我使用SQLServer2012Dialect连接到Microsoft Azure SQL数据库

代码示例: 我的持久化对象包含一个时间戳字段:

@Temporal(TemporalType.TIMESTAMP)
@InDatabaseTimestamp
protected Date date;
my InDatabaseTimestamp批注:

@ValueGenerationType(generatedBy = InDatabaseTimestampGeneration.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface InDatabaseTimestamp {}
我的IndataBaseTimestGeneration类:

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
  }
}
公共类InDatabaseTimestampGeneration实现注释值生成{
@凌驾
public GenerationTiming getGenerationTiming(){
返回生成时间。始终;
}
@凌驾
公共价值生成器getValueGenerator(){
//无内存生成
返回null;
}
@凌驾
公共布尔引用ColumnInSQL(){
返回true;
}
@凌驾
公共字符串getDatabaseGeneratedReferencedColumnValue(){
返回“当前_时间戳”;
}
@凌驾
public void initialize(InDatabaseTimestamp注释,类propertyType){
//无所事事
}
}

您似乎可以尝试如下注释您的财产
日期

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

希望有帮助。

我不能使用它,因为我需要提供自己的注释(hibernate如何猜出我希望以哪种方式生成时间戳?)如果我离开注释,则会出现冲突org.hibernate.AnnotationException:只允许一个生成器注释此答案不处理当前问题all@MichaelGantman,你找到解决办法了吗?我仍在与之斗争it@Mayuran-尝试并尝试为此找到hibernate解决方案。他们在hibernate文档中提供了解决方案,但都不起作用。最后,除了hibernate注释之外,我还在DB中创建了on create和on update触发器on needed字段。这对我很有效me@MichaelGantman遗憾的是,hibernate在创建/更新过程中没有提供生成数据库当前时间戳的方法,即使产品已经成熟了很长一段时间。我会找到其他方法,谢谢你的反馈。非常感谢。我面临着完全相同的问题,我认为这是一个休眠错误。我检查了org.hibernate.persister.entity.AbstractEntityPersister类的代码,可以看到在insert语句中包含de字符串的逻辑在那里,但在update语句中没有。也许有必要报告这一点,并尝试修改hibernatecode@Pablo佩里奇说,“面对完全相同的问题,我认为这是一个休眠错误。我检查了类
org.hibernate.persister.entity.AbstractEntityPersister
的代码,可以看到在insert语句中包含字符串的逻辑在那里,但update语句中没有。可能有必要报告此情况并尝试修改hibernate代码“