Hibernate part 14:クエリーとデータベースの同時トランザクション

7331 ワード


オブジェクト間は相互に関連する、toString()は相互参照しない、java.lang.StackOverflowError .
 
 
HQLクエリー
文法はSQLと似ていて、SQL文の大部分の機能を実現することができて、チェーン式のプログラミングスタイルをサポートして、複雑なクエリーは直接SQLを使って、Hiberanteクエリーの効率は高くありません.
@Test
	public void test01() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
                
                //      
		Query query = session.createQuery(" from Customer where name=?");
		query.setParameter(0, "   ");
		List<Customer> list = query.list();
		System.out.println(list);
                
                //      
		Query query = session.createQuery(" from Customer where name=:name");
		query.setParameter("name", "   ");
		List<Customer> list = query.list();
                
                //     ,         id  
                Customer c1 = (Customer) session.get(Customer.class, 1);
		Query query = session.createQuery("from Order where customer =?");
		query.setEntity(0, c1);
		List<Order> list = query.list();
		System.out.println(list);

		transaction.commit();
		session.close();
	}

オブジェクトナビゲーションですべての顧客の孫芸珍の注文を検索
	@Test
	public void test06() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();

		Customer c1 = (Customer) session.get(Customer.class, 1);
		Query query = session.createQuery("from Order where customer.name =?");
		query.setParameter(0, "   ");
		List<Order> list = query.list();
		System.out.println(list);

		transaction.commit();
		session.close();
	}

uniqueResult()1つまたは0つの結果に異常がない場合、0つの結果を返すとnullとなり、結果が1より大きいと異常があり、通常はパケット関数、sum、count、avg、max、minに用いられ、戻り値はlongタイプである
		long	count=  (Long) session.createQuery("select count(*) from Customer").uniqueResult();

クエリーの名前を付け、設定ファイルにHQLを書き込みます.Customer.hbm.xmlで構成を追加
<query name="findCustomerByName">
		<![CDATA[from Customer where name=?]]>
	</query>

プログラムでxml構成のnameプロパティ名で呼び出す
		List list = session.getNamedQuery("findCustomerByName").setParameter(0, "   ").list();

 
 
 
 
QBC(Query By Criteria)クエリー
オブジェクト向けにクエリー
すべてのCustomerデータの問合せ
	@Test
	public void test02() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();

		List<Customer> list = session.createCriteria(Customer.class).list();
		System.out.println(list);

		transaction.commit();
		session.close();
	}

Customerが孫芸珍のデータを検索
List<Customer> list = session.createCriteria(Customer.class).add(Restrictions.eq("name", "   ")).list();

1番顧客のすべての注文を問い合わせる
		Customer c1 = (Customer) session.get(Customer.class, 1);
		List<Customer> list = session.createCriteria(Order.class).add(Restrictions.eq("customer",c1)).list();

お客様が孫芸珍のすべての注文を照会するには、オブジェクトナビゲーションの方法を採用することはできません.つまり、「.」
		List<Customer> list = session.createCriteria(Order.class).add(Restrictions.eq("customer.name", "   ")).list();
//org.hibernate.QueryException: could not resolve property: customer.name of: rock.lee.bean.Order

オブジェクトのid以外のプロパティに基づいてクエリーを行う場合は、別名を設定します.
Customer c1 = (Customer) session.get(Customer.class, 1);
		List<Customer> list = session.createCriteria(Order.class).createAlias("customer", "c").add(Restrictions.eq("c.name", "   ")).list();

idによるソート
	List<Customer> list = session.createQuery("from Customer order by id desc").list();
	List<Customer> list = (List<Customer>) session.createCriteria(Customer.class).addOrder(org.hibernate.criterion.Order.desc("id")).list();

オフラインクエリーセッションなしでクエリー・オブジェクトを作成し、クエリー条件を設定する
		DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
		detachedCriteria.add(Restrictions.like("name", " %"));
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();
		List<Customer> customers = detachedCriteria.getExecutableCriteria(session).list();
		System.out.println(customers);
		transaction.commit();
		session.close();

 
 
SQLクエリー
 
テーブルのすべてのカラムデータをクエリーするときにObject[]を返します.
 
	@Test
	public void test03() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();

		SQLQuery sqlQuery = session.createSQLQuery("select * from customer");
		List<Object[]> list = sqlQuery.list();
		for (Object[] objs : list) {
			System.out.println(Arrays.toString(objs));
		}

		transaction.commit();
		session.close();
	}
クエリー結果をオブジェクトにバインドします.addEntity()はSQLQuery固有で、クエリーの列はEntityのフィールドに対応する必要があります.
	@Test
	public void test04() {
		Session session = HibernateUtils.openSession();
		Transaction transaction = session.beginTransaction();

		SQLQuery sqlQuery = session.createSQLQuery("select * from customer");
		List<Customer> list = sqlQuery.addEntity(Customer.class).list();
		System.out.println(list);

		transaction.commit();
		session.close();
	}
 
 
 
トランザクションの4つの特性:ACID原子性、一貫性、隔離性、持続性
 
トランザクション・アイソレーションによる問題:
ダーティリード:1つのトランザクションが別のトランザクションを読み込み、データをコミットします.
繰り返し不可:1つのトランザクションが別のトランザクションにコミットされたデータ(update)に読み出されます.
幻読:あるトランザクションが別のトランザクションにコミットされたデータを読み込む(insert)
≪欠落した更新|Valude Update|oem_src≫:2つのトランザクションが同時に1つのデータを変更し、コミットされたデータが前のトランザクションからコミットされたデータを上書きします.
 
トランザクション独立性レベル:
READ_UNCOMMITEDですべての隔離問題が発生するREAD_COMMITTEDはダーティリードの発生を阻止しますが、繰り返し読み取り不可能と幻読みREPEATABLEが発生します.READはダーティリードと重複しないリードを阻止し、幻読SERIALIZABLEがシリアル方式で事務を処理し、同じ時間に一つのものしかなく、同時ではなく、隔離の問題(効率の問題)がない.
MySQLデータベースデフォルトレベルREPEATABLE_READ、OracleデータベースのデフォルトレベルREAD_COMMITTED
 
hibernateはhibernateを提供します.connection.isolationプロパティは、データベースのデフォルトの独立性レベルを変更するために使用されます.値は1 2 2 4 8 1-Read uncommitted isolation 2-Read committed isolation 4-Repeatable read isolation 8-Serializable isolation mysqlデフォルトは4、oracleデフォルト2 hibernateです.cfg.xml独立性レベルの変更
<property name="hibernate.connection.isolation">2</property>

 
失われた更新を解決する2つの方法:
1、悲観ロック:同じ時間に一人だけ修正して、更新を失わないことを保証する(欠点:効率の問題)
2、楽観ロック:データにバージョンフィールドを追加し、データを修正するたびにバージョン+1(バージョンが一致しないと修正できない)を変更し、データベースの下位ロックメカニズムに依存せず、同時に修正することができる.
<version name="ver"></version>