注釈
Hibernate Annotationは、XMLファイルを使用してマッピングを定義しない最新の方法です。注釈は、分離または交換されるXMLマッピングメタデータで使用できます。
Hibernateの注釈は、メタデータオブジェクトとリレーショナルテーブルのマッピングを提供する強力な方法です。すべてのメタデータは、Pojo Javaファイルと一緒に悩まされています。これは、開発プロセス中にテーブルとPojoの構造をユーザーに理解するのに役立ちます。
アプリケーションを他のEJB3固有のORMアプリケーションに移植する場合は、アノテーションを使用してマッピング情報を表す必要がありますが、柔軟性を高める場合は、XMLベースのマッピングを使用する必要があります。
最初に環境でHibernate Annotationを設定すると、JDK5.0を使用していることを確認する必要があります。そうしないと、JDKをJDK5.0のネイティブサポートにアノテーションでアップグレードする必要があります。
第二に、Hibernateの3.xアノテーション配布パッケージをインストールする必要があります。SourceForge:(Hibernate Annotationをダウンロード)を使用し、Hibernate-Annotations.jar、lib/hibernate-comons-annotations.jarおよびlib/ejb3-persistence.jarは、ハイバーナートアニェートからハイバーナートアニートからハイバーネートへの割り当てを割り当てます。
クラスインスタンスのコメント:
前述のように、この上のPojo Javaファイルに冬眠注釈が機能するすべてのメタデータは、開発中のテーブル構造とPOJOの両方を理解するのに役立ちます。
次の従業員テーブルを使用して保存されるオブジェクトを検討してください。
Table Employeeの作成(ID int not null auto_increment、first_name varchar(20)デフォルトnull、last_name varchar(20)デフォルトnull、salary int default null、primary key(id));
以下は、定義された従業員テーブルにマッピングするための注釈を使用したオブジェクト従業員クラスのマッピングです。
Import javax.persistence。 @column(name = "first_name")private string firstname; @column(name = "last_name")private string lastname; @column(name = "salary")private int Salary; public Employee(){} public int getid(){return id; } public void setid(int id){this.id = id; } public string getFirstName(){return firstName; } public void setFirstName(string first_name){this.firstname = first_name; } public string getLastName(){return lastName; } public void setLastName(string last_name){this.lastname = last_name; } public int getSalary(){return Salary; } public void setSalary(int salary){this.salary = salary; }}Hibernateは、@IDアノテーションがフィールドに反していることを検出し、ランタイムドメインを介してオブジェクトのプロパティに直接アクセスする必要があると想定しています。 @IDがgetID()メソッドで注釈が付けられている場合、プロパティはデフォルトでgetterおよびsetterメソッドを介してアクセスされます。したがって、他のすべてのコメントは、ポリシーの下に選択されているように、フィールドメソッドまたはゲッターメソッドのいずれかに配置されます。次のセクションでは、上記のクラスで使用されているコメントについて説明します。
@Entity Annotation:
EJB3仕様の説明はjavax.persistenceパッケージに含まれているため、このパッケージを最初のステップとしてインポートします。第二に、@Entityアノテーションを使用して、このクラスをエンティティビーンの従業員クラスとしてマークするため、パラメーターのないコンストラクターが必要であり、最終的に保護とともに表示されます。
@Table Annotation:
@Table Annotationを使用すると、指定されたテーブルを使用して、データベース内のエンティティに関する詳細な情報を保持できます。
@Table Annotationは、テーブルの名前、そのディレクトリ、スキーマをオーバーライドできる4つのプロパティを提供し、テーブル内の列に一意の制約を実行できます。今、私たちは今、従業員のテーブルの名前を使用しています。
@idおよび@generatedValueアノテーション:
各エンティティBeanには、クラスの@IDアノテーションに注釈が付けられます。主キーは、テーブル構造に応じた単一のフィールドまたは複数のフィールドの組み合わせである可能性があります。
デフォルトでは、@IDアノテーションは使用する最も適切なプライマリキー生成戦略を自動的に決定しますが、ここで説明することはない2つのパラメーター、戦略とジェネレーターを受け入れる@GeneratedValueアノテーションを適用することで使用できます。 Hibernateに、異なるデータベース間のコード移植性を作成するために使用するジェネレータータイプを決定します。
@column annotation:
@columnアノテーションは、マッピングされるフィールドまたはプロパティに列の詳細を指定するために使用されます。次の最も一般的に使用されるプロパティは、列を使用して注釈を付けることができます。
名前属性を使用すると、列の名前を明示的に指定できます。
長さプロパティを使用すると、特に文字列値用の列のサイズをマッピングできます。
Nullableプロパティにより、スキーマを生成するときに列をマークすることができます。
一意のプロパティは、一意の値のみを含むとマークされた列を許可します。
アプリケーションクラスを作成します:
最後に、アプリケーションクラスのメイン()メソッドを作成してアプリケーションを実行します。このアプリを使用して従業員の記録を保存し、CRUD運用に関するレコードを申請します。
java.util.listをインポートします。 Import Java.util.date; import java.util.iterator; org.hibernate.hibernateExceptionをインポートします。 org.hibernate.sessionをインポートします。 Import org.hibernate.transaction; Import org.hibernate.cfg.annotationConfiguration; Import org.hibernate.sessionfactory; Import org.hibernate.cfg.configuration; public class managemployee {private static SessionFactory Factory; public static void main(string [] args){try {factory = new AnnotationConfiguration()。 configure()。 //addpackage("com.xyz ")//使用している場合はパッケージを追加します。 AddAnnotatedClass(Employee.Class)。 BuildSessionFactory(); } catch(throwable ex){system.err.println( "SessionFactoryオブジェクトの作成に失敗しました。" + ex);新しい例外initializererror(ex); } managemployee me = new Managemployee(); / *データベースに少数の従業員レコードを追加 */ integer empid1 = me.addemployee( "zara"、 "ali"、1000); integer empid2 = me.addemployee( "daisy"、 "das"、5000); integer empid3 = me.addemployee( "John"、 "Paul"、10000); / *すべての従業員をリストダウン */ me.listemployee(); / *従業員の記録を更新 */ me.updateemployee(empid1、5000); / *データベースから従業員を削除する */ me.deletemployee(empid2); / *従業員の新しいリストをリストダウン */ me.listemployee(); } / *データベースで従業員を作成する方法 * / public Integer addemployee(string fname、string lname、int salary){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員従業員=新しい従業員(); Employee.setFirstName(fname); Employee.setLastName(lname);従業員。 EmployeeId =(integer)session.save(Employee); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); } employeedを返します。 } / *すべての従業員を読む方法 * / public void listemployees(){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction(); List Employees = session.createquery( "from Employee")。list(); for(iterator iterator = employes.iterator(); iterator.hasnext();){従業員=(従業員)iterator.next(); System.out.print( "名:" + employee.getFirstName()); System.out.print( "last Name:" + Employee.getLastName()); System.out.println( "salary:" + employee.getSalary()); } tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *従業員の給与を更新するメソッドトランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID);従業員。 session.update(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *レコードから従業員を削除する方法 * / public void deletemployee(integer EmployeeID){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID); session.delete(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }}}データベース構成:
次に、hibernate.cfg.xml構成ファイルを作成して、データベースの関連パラメーターを定義します。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" "> <hibernate-configuration> org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <! - 学生はデータベース名です - > <プロパティname = <hibernate.connection.url " name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> cohondob </property> </session-factory> </hibernate-configuration>
コンパイルと実行:
上記のアプリケーションをコンパイルして実行する手順は次のとおりです。コンパイルして実行する前に、パスとクラスパスが適切に設定されていることを確認してください。
employee.hbm.xmlマッピングファイルをパスから削除します。
上記の画像に示すように、従業員。Javaソースファイルを作成してコンパイルします。
上記の画像に示すように、managemployee.javaソースファイルを作成してコンパイルします。
managemployeeのバイナリファイルを実行して、プログラムを実行します。
次の結果が得られ、記録は従業員のテーブルに記録されます。
$ java Managemployee ...........さまざまなログメッセージがここに表示されます.........名:Zara姓:Ali Salary:1000first Name:Daisy姓:Das姓:5000first名:ポール姓:Zara姓:Ali Salary:John Last Name:Paul Salary:100000000000000000000000000
従業員のテーブルを確認する場合、次の記録が必要です。
mysql> select * from Employee;+---+----------+----------+--------+| ID | first_name | last_name |給与|+----+-----------+----------+--------+| 29 |ザラ|アリ| 5000 || 31 |ジョン|ポール| 10000 |+----+------------+----------+--------+2行セット(0.00 secmysql>
キャッシュ
キャッシュはアプリケーションのパフォーマンスの最適化に関するものであり、複数のデータベースアクセスを回避し、パフォーマンスが批判的なアプリケーションをより良くするために、アプリケーションとデータベースの間に配置されます。
キャッシュは冬眠にとって重要であり、以下に説明するマルチレベルのキャッシュスキームを採用しています。
レベル1キャッシュ:
最初のレベルのキャッシュはセッションキャッシュであり、これは必須のキャッシュであり、それを介したすべての要求は渡す必要があります。セッションオブジェクトは、データベースに送信する前に、常にオブジェクトによって搭載されています。
複数の更新が発行された場合、Hibernateは、SQLステートメントを発行した更新の数を減らすために、可能な限り更新を遅らせようとします。セッションを閉じると、すべてのキャッシュされたオブジェクトが永続的であるか、データベースで更新されます。
レベル2キャッシュ:
レベル2キャッシュはオプションであり、レベル1のキャッシュは、オブジェクトのレベル2キャッシュを見つける前に常に求められるものです。 2番目のレベルのキャッシュは、セッションでキャッシュされたオブジェクトの主に責任を負うクラスごとのカテゴリごとに構成できます。
サードパーティのキャッシュは、冬眠を使用できます。 org.hibernate.cache.cacheproviderインターフェイスは提供されており、冬眠を提供するためのハンドルキャッシュ実装を実装する必要があります。
クエリレベルキャッシュ:
Hibernateは、クエリ結果セットキャッシュとレベル2キャッシュの緊密な統合も実装しています。
これは、テーブルが最後に更新されたときにキャッシュされたクエリの結果と領域を保存するために2つの追加の物理的キャッシュを必要とするオプションの機能です。これは、同じパラメーターでしばしば実行されるクエリに非常に役立ちます。
レベル2キャッシュ:
Hibernateはレベル1キャッシュを使用します。デフォルトでは、レベル1キャッシュでは何もしません。オプションの第2レベルのキャッシュに直接行きましょう。すべてのクラスがキャッシュの恩恵を受けるわけではないため、レベル2キャッシュを無効にすることが重要です。
Hibernateレベル2キャッシュは2つのステップに設定されています。まず、どの並行性戦略を使用するかを決定する必要があります。この後、キャッシュの有効期限を構成し、キャッシュを使用して物理キャッシュ属性を提供できます。
並行戦略:
並行性ポリシーは、データ項目をキャッシュに保存し、キャッシュから取得するメディエーターです。レベル2のキャッシュを有効にする場合は、永続的なクラスとコレクションごとに使用するCachcurrencyポリシーを決定する必要があります。
トランザクション:この戦略を使用して主にデータを読み取り、時代遅れのデータの同時トランザクションを防ぐことは、まれな更新の場合に重要です。
読み取り - write:繰り返しますが、この戦略を使用して、データの主な読み取りは、まれな更新の場合に古いデータからの同時トランザクションを防ぐために重要です。
nonctrict-read-write:この戦略は、キャッシュとデータベースの一貫性を保証するものではありません。この戦略では、データがめったに変更されず、古いデータの可能性が古くする場合、重要なことは注意を払わないことです。
読み取り専用:並行性ポリシーはデータに適しており、決して変更されません。使用されるデータは参照用です。
2番目のレベルのキャッシュを従業員クラスとして使用する場合は、従業員のインスタンスに読みやすく書かれたキャッシュポリシーを使用するように冬眠に指示するために必要なマッピング要素を追加しましょう。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <cache usage = "read-write"/> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstname" column = "first_name" type = "string"/> <プロパティ名= "lastName" column = "last_name" type = "" int "int" colum " </class> </hibernate-mapping>
usage = "read-write"プロパティは、hibernateに、読み取りワイトの並行性ポリシーで定義されたキャッシュを使用するように指示します。
キャッシュプロバイダー:
キャッシュ候補クラスの並行性ポリシーを検討した後、次のステップはキャッシュプロバイダーを選択することです。冬眠は、アプリケーション全体にサービスを提供するためにキャッシュを選択します。
指定されたhibernate.cfg.xml構成ファイルで提供されるキャッシュ。第2レベルのキャッシュプロバイダーとしてehcacheを選択します。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-configuration system "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" "> <hibernate-configuration> org.hibernate.dialect.mysqldialect </property> <property name = "hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <! - 学生はデータベース名です - > <プロパティname = <hibernate.connection.url " name = "hibernate.connection.username"> root </property> <property name = "hibernate.connection.password"> root123 </property> <Property name = "hibernate.cache.provider_class"> org.hibernate.cache.cache.ehcacheprovider < resource = "Employee.hbm.xml"/> </session-factory> </hibernate-configuration>
これで、キャッシュ領域のプロパティを指定する必要があります。 Ehcacheには、ClassPathのアプリケーションに独自の構成ファイルehcache.xmlがあります。 ehcache.xmlでは、従業員クラスのキャッシュ構成が次のようになる場合があります。
<diskstore path = "java.io.tmpdir"/> <defaultcachemaxelementsinmemory = "1000" eterinal = "false" false "TimetoidLeseConds =" 120 "TimetoliveseConds =" 120 "Overflowtodisk =" true "/> <cache name = "Employee" MaxElementsInmemory = "500" ETERNAL = "TRUE" TIMETOIDLESECONDS = "0" TIMETOLIVESCONDS = "0" OVERFLOWTODISK = "FALSE"/>
それだけで、従業員に閲覧するたびに、または従業員が識別子によってロードされたときに、従業員クラスのセカンダリキャッシュと冬眠がセカンダリキャッシュを実現できるようになりました。
すべてのクラスを分析し、各クラスの適切なキャッシュ戦略を選択する必要があります。場合によっては、セカンダリキャッシュがアプリケーションのパフォーマンスを低下させる場合があります。そのため、キャッシュとチェックのパフォーマンスに非常に適したキャッシュを初めて有効にしないベンチマークアプリケーションに推奨されます。キャッシュがシステムのパフォーマンスを改善しない場合、あらゆる種類のキャッシュを作成することは意味がありません。
クエリレベルキャッシュ:
クエリキャッシュを使用すると、最初にhibernate.cache.use_query_cache = "true"プロパティ構成ファイルでアクティブにする必要があります。このプロパティがtrueに設定されている場合は、クエリと識別子セットを保存するために、メモリに必要なキャッシュをHibernateに作成させます。
次に、クエリキャッシュを使用して、クエリクラスのセットキャッチ可能な(ブール)メソッドを使用できます。例えば:
Hibernateは、キャッシュ領域の概念を通じて非常に細かいキャッシュサポートもサポートしています。キャッシュは名前が与えられたキャッシュの一部です。
このコードは、Hibernateにキャッシュ内の従業員のクエリを保存して見つけるように指示する方法を使用します。