名前と値のフィールドを持つ Variable というオブジェクトがあります。name フィールドは、Hibernate で「識別子」となる主キーです。1)変数がまだ存在しない場合はデータベースに挿入し、2)データベース内の変数が既に存在する場合は更新します。それ、どうやったら出来るの?私はすでにHibernateのドキュメントを見てきましたが、混乱しています。一時的、永続的、分離された状態についての長い説明に入りますが、それについていくつかの質問を指摘します。
Transient - オブジェクトが new 演算子を使用してインスタンス化されたばかりで、Hibernate セッションに関連付けられていない場合、オブジェクトは一時的です。データベースに永続的な表現がなく、識別子の値が割り当てられていません。アプリケーションが参照を保持しなくなった場合、一時インスタンスはガベージ コレクターによって破棄されます。Hibernate Session を使用して、オブジェクトを永続化します (そして、Hibernate に、この移行のために実行する必要がある SQL ステートメントを処理させます)。
新しい変数オブジェクトをインスタンス化すると、その変数オブジェクトは new 演算子でインスタンス化されているため、明らかに一時的です。データベースで既に見つかっている名前 (識別子/主キー プロパティ) を割り当てるとどうなるでしょうか。まだ一過性ですか?技術的には、まだ Hibernate セッションに関連付けられていません。Hibernate は、私の変数オブジェクトが存在することを知りません。ただし、識別子が割り当てられており、その識別子はデータベースに既に存在しています。それで、それはどちらですか..この時点で一時的なオブジェクトですか?
永続 - 永続インスタンスには、データベース内の表現と識別子値があります。保存またはロードされたばかりの可能性がありますが、定義上、セッションのスコープ内にあります。Hibernate は、永続状態のオブジェクトに加えられた変更を検出し、作業単位が完了すると状態をデータベースと同期します。オブジェクトを一時的にする必要がある場合、開発者は手動の UPDATE ステートメントや DELETE ステートメントを実行しません。
永続性のこの定義は、Hibernate セッションから変数オブジェクトをロードすると.load(Variable.class, "name")
、セッションがその存在を認識しているため、その変数が永続化されることを意味します。ただし、「作業単位が完了すると、状態をデータベースと同期する」とも書かれています。それはいつ起こりますか?変数に変更を加えた後、データベースから .load() した変数に対して .save() または .update() を呼び出す必要がありますか? それ以外の場合、更新する DB の値を取得するにはどうすればよいですか?
基本的に、Hibernate - Working with Objects に関するドキュメントを読みましたが、永続的および一時的な状態の説明はまだ不明であるため、save、update、および saveOrUpdate も不明です。