当我在实体上进行更新时,我不知道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收到实体时,两个字段都将为空-符合预期,因为它们没有绑定到任何表单字段。


打电话后

sessionFactory.getCurrentSession().saveOrUpdate(object);


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

因此,实体不再包含数据库中的值-这是不希望的行为。

对于我的情况可以解决问题
-我可以将GenerationTime更改为ALWAYS-但这似乎很令人困惑,因为createdBy实际上仅在插入实体时才设置。
-我可以刷新实体-但我想避免额外的电话。


所描述情况的最佳实践是什么?是否有更好的选择来避免显式调用refresh,并且不会混淆仅在插入时修改的字段的语义?
使用@Generated(value = GenerationTime.INSERT)的合理方案是什么?

最佳答案

你可以这样尝试吗
@Temporal(TemporalType.TIMESTAMP)
@Generated(GenerationTime.ALWAYS)
@Column(name =“ create_date”,insertable = false,updatable = false)
私人日历createDate;

09-09 16:52