wiki:java/HibernateJPA

Version 3 (modified by toraneko, 54 years ago) (diff)

--

Hibernate JPAとは?

J2EE5標準仕様のO/RマッピングのAPIとして、Java Persistence API(JPA)が策定されています。Hibernate JPAはHibernateをこのJPAに対応させたものです。JBoss5からは、EJB3対応を行うために、Hibernate JPAがJPAのコアとして利用されます。

Tips

Hibernate JPAの利用方法については、他のWebページなりをご覧ください。ここでは、上級者向けのTipsを紹介します。

動的にAnnotated Classをロード

JPAで利用できるようにしたエンティティクラスは、通常persistence.xmlから読み込みます。例えば、次のように記述します。

  <persistence-unit name="em">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>example.ejb3.Account</class>
    <class>example.ejb3.Item</class>
    ....

しかし、これでは動的にクラスを読み込むことができません。動的に読み込みたい場合は、次のようにします。

   Ejb3Configuration configuration = new Ejb3Configuration();
   configuration.addAnnotatedClass(Account.class);
   configuration.addAnnotatedClass(Item.class);
   ...
   EntityManager em = configuration.createEntityManagerFactory().createEntityManager();

また、hibernate.properties(もしくはhibernate.cfg.xml)でその他の設定を行う必要があります。 詳細は、下記のクラスを参照してください。

統計情報の取得

Hibernateには、エンティティクラス毎にCRUDの操作の統計情報を取るAPIが用意されています。このAPIを利用すると、パフォーマンスチューニング等で有用な情報を取得することができます。このAPIを利用するには次のようにします。

EntityManagerFactoryImpl factoryImpl = (EntityManagerFactoryImpl)factory;
Statistics stat = factoryImpl.getSessionFactory().getStatistics();
String[] entities = stat.getEntityNames();
System.out.println("[dump]");
for(int i=0;i<entities.length;i++){
  System.out.println(entities[i]+":"+stat.getEntityStatistics(entities[i]));
}

実行結果は、次のようになります。

org.ultimania.ejb.Purchaseorder:EntityStatistics
 [loadCount=0,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]
org.ultimania.ejb.Orderdetail:EntityStatistics
 [loadCount=0,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]
org.ultimania.ejb.Customer:EntityStatistics
 [loadCount=0,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]
org.ultimania.ejb.Item:EntityStatistics
 [loadCount=2,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]