エンティティを更新するときの@Generated(value=GenerationTime.INSERT)で注釈が付けられたフィールドに関する Hibernate の動作について疑問に思います。
次のフィールドを持つエンティティがあります (データベース トリガーによって入力されます。最初のフィールドは挿入時、2 つ目は挿入時、更新ごとに入力されます)。
@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) を使用する合理的なシナリオは何ですか?