在Hibernate@Generated注释中使用GenerationTime.INSERT的合理场景是什么



当我对实体进行更新时,我想知道Hibernate对用@Generated(value=GenerationTime.INSERT)注释的字段的行为。

我有一个具有以下字段的实体(由数据库触发器填充,第一个在插入时,第二个在插入和每次更新时):

@Generated(value = GenerationTime.INSERT)
@Column(name="created_by", insertable = false, updatable = false)
private String createdBy;
@Generated(value = GenerationTime.ALWAYS) 
@Column(name="updated_by", insertable = false, updatable = false)
private String updatedBy;
  • 当我从数据库加载一个实体时,两个字段都会填充——正如预期的那样
  • 当我从web ui收到实体时,这两个字段都将为null——正如预期的那样,因为它们没有绑定到任何表单字段

调用后

sessionFactory.getCurrentSession().saveOrUpdate(object);

createdBy字段将为null,但updatedBy字段会设置为正确的值(由数据库创建)。

因此,实体不再包含数据库中的值——这是一种不希望出现的行为。

因为我的情况可以解决问题-我可以将GenerationTime更改为ALWAYS,但这似乎令人困惑,因为createdBy实际上只在插入实体时设置。-我可以对实体进行刷新,但我希望避免额外的调用。

  1. 对于所描述的情况,最佳做法是什么是否有更好的选项可以避免显式调用刷新,并且不会混淆仅在插入时修改的字段的语义
  2. 使用@Generated(value=GenerationTime.INSERT)的合理场景是什么

你能这样试试吗。@时态(TemporalType.TIMESTAMP)@生成(GenerationTime.ALLWAYS)@列(name="create_date",insertable=false,updateable=false)private Calendar createDate;

最新更新