当我对实体进行更新时,我想知道 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 字段将为空,但 updatedBy 字段将设置为正确的值(由数据库创建)。
因此,实体不再包含数据库中的值——这是一种不受欢迎的行为。
对于我的情况可以解决问题 - 我可以将 GenerationTime 更改为 ALWAYS - 但这似乎令人困惑,因为 createdBy 实际上仅在插入实体时设置。- 我可以对实体进行刷新 - 但我想避免额外的调用。
- 对于所描述的情况,最佳做法是什么?是否有更好的选项可以避免显式调用刷新并且不会掩盖仅在插入时修改的字段的语义?
- 使用@Generated(value=GenerationTime.INSERT) 的合理场景是什么?