3

エンティティを更新するときの@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 は実際にはエンティティが挿入されたときにのみ設定されるため、これは混乱しているようです。-エンティティを更新できますが、余分な呼び出しは避けたいです。

  1. 説明されている状況のベスト プラクティスは何ですか? 更新の明示的な呼び出しを回避し、挿入時にのみ変更されたフィールドのセマンティックを曖昧にしない、より良いオプションはありますか?
  2. @Generated(value=GenerationTime.INSERT) を使用する合理的なシナリオは何ですか?
4

1 に答える 1

-1

このように試すことができますか。@Temporal(TemporalType.TIMESTAMP) @Generated(GenerationTime.ALWAYS) @Column(name="create_date", insertable=false,updatable=false) private Calendar createDate;

于 2015-04-03T08:46:44.613 に答える