当我对实体进行更新时,我想知道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实际上只在插入实体时设置。-我可以对实体进行刷新,但我希望避免额外的调用。
- 对于所描述的情况,最佳做法是什么是否有更好的选项可以避免显式调用刷新,并且不会混淆仅在插入时修改的字段的语义
- 使用@Generated(value=GenerationTime.INSERT)的合理场景是什么
你能这样试试吗。@时态(TemporalType.TIMESTAMP)@生成(GenerationTime.ALLWAYS)@列(name="create_date",insertable=false,updateable=false)private Calendar createDate;