JPAは慎重なエンターテイトに切り替えます.


今日は同僚とコードを調整していますが、findUserByIdのような方法が、udateのsql文を生んでいます.不思議な感じがします.更新されたところを見つけられませんでした.どうやってこのudate文が生まれたのですか?
この方法は大体こんな感じです.

public User findUserById(Integer uid) {
    return entityManager.find(User.class, uid);
}
   コードをよくチェックしたところ、User類にはこんなやり方がありました.

public class User implements Serializable {
    ... ...
    private Date lastLoginTime;

    public void setLastLoginTime(Date date) {
        this.lastLoginTime = new Date();
    }
    ... ...
}
    以前はヒップホップに慣れていた友達(私のように)は、FINDがオブジェクトを出すと感じるかもしれませんが、どうやってこのオブジェクトを区画変更したら、データベースに同期しません.JTA環境では、そうではありません.JTA環境では、デフォルトでは、データベースの操作方法は、メソッドの開始前に一つのビジネスを開始します.方法が終わったらこの事務を提出します.このプロセスはプログラマにとって透明で、プログラマー自身が感じられない、コードを書かなくても済むことです.
    この道理を知らない友達は、多くの人が私と同じように学習の初期に、EJBは複雑で使いにくいと言われました.全部XXX without EJBという本にスピンオフ+を直接勉強するようにそそのかされました.  Hibernate+Sttusに行きました.Springといえばどれほど良いものかと言えます.その中には「声明事務管理」というものがあります.当時はなぜ「声明事務」と呼ばれていたのか分かりませんでしたが、その事務ブロックでadd*、save*、delete*を配置しました.saveUserのような方法でいいです.jdbcをまっすぐ書きに行く時になって、spring事務管理にそのプログラミング事務を書かせないということが分かりました.

tx.start();
... ...
tx.commit();
    ですから、初めて声明式の事务はどういうことかを知りました.これは远く离れてしまいました.でも、しょうがないです.私たちの大学でjavaの文法を交换しました.そして、人の会社が募集すると、sshなどが必要になります.覚えているのはこの二つのトレーニング機関の一番人気の授業料は高いです.1 Wではなく2 Wです.その時は二つの選択がありました.一つはスーパークールなパソコンを買うことです.一つはそこに行って訓練します.何回も海を考えたら「ディラン常景」のグラフィックカードの誘惑に耐えられなくなりました.ついに1.2 Wのコンピュータを作りました.javaの日を学びながら…遠すぎる話をして、やはり正体に帰ります.
    EJB環境では、ベントナイトマシナーというものがありますが、これはhibernaneのsessionとは違って、sessionから出てきたオブジェクトは、中の属性を任意に修正して、自分でudateを呼び出すまではデータベースに更新されますが、EJBの下では、そのようなものではありません.
    EJBの中のentityManagerの中国持ちの対象は大体3種類あります.
    1.entityManager.persist(Object o)を呼び出します.
    2.entituManager.merge(Object o)を呼び出します.
    3.entityManager.findを呼び出す(Class clazz、Object o)
最初の種類:
    元のデータベースにはこの記録がありませんでした.呼び出し後はデータベースに同期します.前提条件は事務提出です.デフォルトのEJB環境では、自動的にこの事務を提出します.

user.setName("111111");
entityManager.persist(user);
user.setName("222222");
このように最終的に、データベースに同期するのはuser.name=22222です.
    なぜですか?これは私たちが元々使っていたヒベルナとは大きく違って、ヒベルナにもpersistという方法がありますが、sshのような環境で使うことはめったにありません.一般的にはsave方法だけを使います.
persistとsaveはいったい何が違っていますか?自分の説明がクリアされないかと心配して、ネットで言葉を書き写しました.
persistは、一時的なインスタンスを永続化するが、「保証されていない」識別子は、直ちに永続化インスタンスに記入され、識別子の入力はflushに延期される可能性がある時間に延期される.
   
    私の話では、オブジェクトをentityManagerに預けて管理していますが、entiyManagerはすぐにデータベースに書き込むことを保証していません.flashメソッドを呼び出した時に提出します.デフォルトでは、一つの仕事が終わったら、自動的にflashメソッドを呼び出すので、データベースに同期します.上のプログラムは最終的にデータベースに書きました.22222です.
    しかし、セーブ方法はすぐにデータベースに書き込みます.
第二種類:
    これは、hibernateのudateと比較する方法を持ってきます.udateを実行するということは、データベースにその対象に対応する記録がすでにあります.ただ、現在は更新操作をして、対象の属性値をデータベースに同期させます.udate操作を実行すると、sql文がすぐに印刷されます.merge方法はありません.上のsaveと同じです.この更新が必要なオブジェクトをentityManagerに管理しているだけで、すぐにデータベースに同期した操作を実行するという意味ではなく、flushメソッドを呼び出して、entityManagerが同期したデータベースに行くという意味でもありません.同じように、ビジネスが終わる時にも自動的にflushメソッドを呼び出します.
第三種類:
    検索を実行します.データベースにこのデータがあると、上の方に参照して呼び出されます.
データベース-->entityManager->findUserById、3つの過程で、ここで私達のファーストUserByIdという方法は上層といいます.もっと上の方の方法で呼び出すことができます.findUserByIdの方法を呼び出すと、デフォルトのEJB容器は事務を開始します.
一番上に書いたUser類を持って言ってください.
1.まずentityManagerはデータベースからレコードを検索します.
2.Userのデフォルトのコンストラクタを呼び出してオブジェクトを生成します.
3.次にデータベースに記録された値をこの新入生の対象に割り当て、User類のsetXXX方法を呼び出して値を付けます.
4.組み立てたオブジェクトを上に戻して呼び出します.
    しかし、上のコードsetLastLoging Timeのやり方は、直接にbeanに最新の時間を作ることを意図しています.すると、下の階で呼び出した時に、最新のDateインスタンスを使って元の値をカバーし、上の階に戻るUserオブジェクトの属性値がデータベースと一致しないため、一回のfindUserByIdを実行することによってudateの操作が発生します.
    知らないうちに開発の過程に慣れてしまったようです.イベントはpojoとして扱っています.
    ちょっと経験がありますので、書いてください.助けてください.