ホームページ  >  記事  >  类库下载  >  休止状態の概要

休止状態の概要

高洛峰
高洛峰オリジナル
2016-10-31 14:24:171504ブラウズ

Hibernate は、パフォーマンスを向上させるためにキャッシュとスナップショットのメカニズムを提供します。

そのキャッシュは、一次キャッシュと二次キャッシュに分かれています。

Hibernate 1 次キャッシュ: SQL ステートメントがトランザクションで実行されると、返された結果はセッションの Map コレクションに保存されます (もちろん、スナップショットもあります)。

テスト: (以下のコードはすべてtry/catchブロック内にあります)

Configuration config=new Configuration().configure();//configure()方法是加载src/hibernate.cfg.xml配置文件
        SessionFactory sf=config.buildSessionFactory();
        Session s=sf.openSession();//Session是高一级的对Connection的封装
        Transaction tran=null;
        try {
            tran=s.beginTransaction();
            
            //代码在此

            tran.commit();
        } catch (HibernateException e) {
            if(tran!=null){
                tran.rollback();
            }
            e.printStackTrace();
        } finally{
            s.close();
            sf.close();
        }

Query: get()、load()、ネイティブSQL、HQL、Criteria(HQLよりもオブジェクト指向のクエリメソッドを含む)

//1.get(),load()方法测试
            User u=(User) s.get(User.class, 1);//第一次查询生成SQL语句,并将结果放入缓存
            User u1=(User) s.get(User.class, 1);//第二次查询并无生成SQL语句,但结果取自缓存
            p(u==u1);//true

            //2.HQL查询
            Query q=s.createQuery("from domain.User where id=1");
            User u2=(User) q.uniqueResult();//第三次查询生成了SQL语句,但结果取自缓存
            p(u2==u);//true

            //3.原生Sql
            SQLQuery q1=s.createSQLQuery("select * from User where id=1");
            q1.addEntity(User.class);
            User u3=(User) q1.uniqueResult();//第四次查询生成了SQL语句,但结果取自缓存
            p(u3==u);//true

            //4.Criteria查询
            Criteria c=s.createCriteria(User.class);
            c.add(Restrictions.eq("id", 1));
            User u4=(User) q1.uniqueResult();//第五次查询生成了SQL语句,但结果取自缓存
            p(u4==u);//true

概要クエリ:

休止状態の概要

追加: save()、persistent()

            User user = new User();//对象的瞬态
                user.setName("xiaobai");
                user.setAge(121);
                s.save(user);//对象的持久态
          s.persist(user);

ここでの 2 つのメソッドの違いは、メソッドを実行する前に主キーを設定する問題と、メソッドの実行後に主キーを返す問題です。その方法。

1、persist() は、一時的なインスタンスを永続化しますが、識別子 (識別子の主キーに対応する属性) が永続的なインスタンスに直ちに埋められること、および識別子の埋め込みが「保証」されるわけではありません。洗い流す時間が遅れる場合があります。

2. save() は、一時的なインスタンスの永続化識別子を生成し、その識別子を返すため、SQL 挿入がすぐに実行されます。

User u = new User();
                u.setName("xiaobai");
                u.setAge(121);
                s.save(u);//插入数据库,并将对象瞬态转为持久态,将返回对象存入缓存
                User u1=(User) s.get(User.class, u.getId());//这次查询没有生成SQL语句,结果取自Session的缓存
                p(u1==u);//true

Delete: delete()

User u=(User) s.get(User.class, 10);//クエリ操作を実行します
s.delete(u);//オブジェクトの永続状態をフリー状態に変換しますstate

もちろん、データを削除するためにクエリ操作を実行するとパフォーマンスが低下すると思われる場合は、次のようにすることもできます。

s.delete(u);



Update: update()

User u=(User) s.get(User.class, 1);

u.setName("set");


でも時々 s.update( Object) メソッドを実行する必要はありません。これには、オブジェクトの永続状態の機能が含まれます ([スナップショット] もその役割を果たします)。

オブジェクトが永続的であるとき、オブジェクトが更新されるときデータが同じである場合、フレームワークはそれを前のスナップショットと比較します。異なる場合は何も実行されず、データベースに自動的に更新されます。

//当然,也可以这么做
User u=new User();//对象的瞬态,不具备自动更新功能,需要我们手动update()
u.setAge(1);
u.setId(1);
u.setName("1");
s.update(u);

まとめ:

非常に重要な点が 1 つあります。SQL ステートメントはトランザクション内で形成されますが、データベースは実際に操作されるのは、transaction.commit() の後でのみです。

Hibernate は、[キャッシュ、スナップショット、オブジェクトのスリーステート] およびデータベース操作に関するその他の事項を把握する必要があります。

オブジェクトの 3 つの状態:

* 一時的な状態: 休止状態に関連しない、データベース テーブルに対応する ID なし

* 永続的な状態: 休止状態に関連する、データベース テーブルに対応する ID---OID がある

* 無料state : Hibernate とは関係ありませんが、データベーステーブルに対応する ID があります



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。