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()
u.setName("set");
でも時々 s.update( Object) メソッドを実行する必要はありません。これには、オブジェクトの永続状態の機能が含まれます ([スナップショット] もその役割を果たします)。
//当然,也可以这么做 User u=new User();//对象的瞬态,不具备自动更新功能,需要我们手动update() u.setAge(1); u.setId(1); u.setName("1"); s.update(u);
* 永続的な状態: 休止状態に関連する、データベース テーブルに対応する ID---OID がある
* 無料state : Hibernate とは関係ありませんが、データベーステーブルに対応する ID があります