ハイベルナーAnnotations実戦(一)

13978 ワード

ソース:http://www.360doc.com/content/06/0425/12/5136_10878.shtml 
--hbm.xmlからAnnotationsまで
Matrixを取得したサイトは、以下の作者の情報とリンクを残してください。著者:icess(作者のブログ:http://blog.matrix.org.cn/page/icess)キーワード:Hibernate Validator
まず、一般的なhbm.xmlマッピングファイルの例を見ましょう。3つのクラスがあります。HibernateUtil.java つまり、Hybernateドキュメントで推奨されているツールクラスです。Person.javaは耐久性のあるクラスです。Test.javaテスト用のクラスです。全部test.hibernateにあります。 各クラスのコードは以下の通りです。
HIbernature Util工具類:
 
 package test.hibernate;
 
 import org.hibernate.HibernateException;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.Configuration;
 
 public class HibernateUtil {
   public static final SessionFactory sessionFactory;
   
   static {
     try {
       sessionFactory = new Configuration()
               .configure()
               .buildSessionFactory();
     } catch (HibernateException e) {
       // TODO Auto-generated catch block
       
       e.printStackTrace();
       throw new ExceptionInInitializerError(e);
     }
   }
   
   public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
   
   public static Session currentSession() throws HibernateException {
     Session s = session.get();
     
     if(s == null) {
       s = sessionFactory.openSession();
       session.set(s);
     }
     
     return s;
   }
   
   public static void closeSession() throws HibernateException {
     Session s = session.get();
     if(s != null) {
       s.close();
     }
     session.set(null);
   }
 }
 
 
 
 ユーザエンティティクラス:Person 
 
 package test.hibernate;
 
 import java.util.LinkedList;
 import java.util.List;
 
 /**
  * 
  */
 
 @SuppressWarnings("serial")
 public class Person implements java.io.Serializable {
 
   // Fields
 
   private Integer id;
 
   private String name;
 
   private String sex;
 
   private Integer age;
 
   private List list = new LinkedList();
 
   // Collection accessors
 
   public List getList() {
     return list;
   }
 
   public void setList(List list) {
     this.list = list;
   }
 
   /** default constructor */
   public Person() {
   }
 
   /** constructor with id */
   public Person(Integer id) {
     this.id = id;
   }
 
   // Property accessors
 
   public Integer getId() {
     return this.id;
   }
 
   public void setId(Integer id) {
     this.id = id;
   }
 
   public String getName() {
     return this.name;
   }
 
   public void setName(String name) {
     this.name = name;
   }
 
   public String getSex() {
     return this.sex;
   }
 
   public void setSex(String sex) {
     this.sex = sex;
   }
 
   public Integer getAge() {
     return this.age;
   }
 
   public void setAge(Integer age) {
     this.age = age;
   }
 
 }
 
 
 
 
 
 /*
  * Created on 
  * @author 
  */
 package test.hibernate;
 
 import java.sql.SQLException;
 
 import org.hibernate.FlushMode;
 import org.hibernate.HibernateException;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
 
 public class Test {
   
   public static void main(String [] args) {
     Session s = HibernateUtil.currentSession();
     
     Transaction tx = s.beginTransaction();    
     
 //    Person p = (Person) s.load(Person.class, 1);
 //    System.out.println(p.getName());
     Person p = new Person();
     
     p.setAge(19);
     p.setName("icerain");
     p.setSex("male");
     s.save(p);
     s.flush();
     /*
     Person p2 = (Person) s.get(Person.class, new Integer(1));
     System.out.println(p2.getName());
     p2.setName("ice..");
     s.saveOrUpdate(p2);
     s.flush();
     Person p3 = (Person) s.get(Person.class, new Integer(2));
     System.out.println(p3.getName());
     s.delete(p3);
     */
     
     tx.commit();  
     try {
       System.out.println(p.getName());
     } catch (Exception e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
     
     HibernateUtil.closeSession();
   }
 }
 
ヒベルナ.cfg.xmlのプロファイルは以下の通りです。mysqlデータベースを利用します。
 
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>

<property name="hibernate.connection.password">       </property>

<property name="hibernate.connection.url">jdbc:mysql://localhost/    </property>

<property name="hibernate.connection.username">   </property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="show_sql">true</property>

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

<property name="hibernate.transaction.auto_close_session">false</property>

<property name="hibernate.hbm2ddl.auto">update</property>

 

<mapping resource="test/hibernate/annotation/Person.hbm.xml"/>

</session-factory>

</hibernate-configuration>
 このうち、「property name=「hibernate.hbm 2 ddl.aut」を配置しました。udate属性は、自動的にデータベースを導入します。生産のddl sql文は以下の通りです。
create table person (id integer not null auto_increment, name varchar(255), sex varchar(255), age integer, person integer, primary key (id))
alter table person add index FKC4E39B5511C4A5C2 (person), add constraint FKC4E39B5511C4A5C2 foreign key (person) references person (id)
 
Person.hbm.xmlファイルは以下の通りです。
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="test.hibernate.Person" table="person">

<id name="id" type="integer">

<column name="id" />

<generator class="native"></generator>

</id>

<property name="name" type="string">

<column name="name" />

</property>

<property name="sex" type="string">

<column name="sex" />

</property>

<property name="age" type="integer">

<column name="age" />

</property>

 

<bag name="list" cascade="all">

<key column="person"></key>

<one-to-many class="test.hibernate.Person"/>

</bag>

</class>

</hibernate-mapping>
 以下では、Hibernate Annotationsを利用して、hbm.xmlの設定ファイルが必要でない限り、3つのカテゴリを見てみましょう。また、使用している2つのjarファイルを入れるルートの中にあります。具体的にはどうすればいいですか?参照してください。 ハイベルナーAnnotations中国語ドキュメントhttp://hb.6644.netHibernateUtil.java つまり、Hibernateドキュメントで推奨されているツール類です。Person.javaは恒久的なクラスです。Test.javaテスト用のクラスです。test.hibernation.annotationパッケージにあります。各種類のコードは以下の通りです。
 package test.hibernate.annotation;
 
 import org.hibernate.HibernateException;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
 import org.hibernate.cfg.AnnotationConfiguration;
 import org.hibernate.cfg.Configuration;
 
 public class HibernateUtil {
   public static final SessionFactory sessionFactory;
   
   static {
     try {
       sessionFactory = new AnnotationConfiguration()   //  :    SessionFactory      
                 .addPackage("test.hibernate.annotation")
                 .addAnnotatedClass(Person.class)
                 
                 .configure()
                 .buildSessionFactory();
         //new Configuration().configure().buildSessionFactory();
     } catch (HibernateException e) {
       // TODO Auto-generated catch block
       
       e.printStackTrace();
       throw new ExceptionInInitializerError(e);
     }
   }
   
   public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
   
   public static Session currentSession() throws HibernateException {
     Session s = session.get();
     
     if(s == null) {
       s = sessionFactory.openSession();
       session.set(s);
     }
     
     return s;
   }
   
   public static void closeSession() throws HibernateException {
     Session s = session.get();
     if(s != null) {
       s.close();
     }
     session.set(null);
   }
 }
 
 package test.hibernate.annotation;
 
 import java.util.LinkedList;
 import java.util.List;
 
 import javax.persistence.AccessType;
 import javax.persistence.Basic;
 import javax.persistence.Entity;
 import javax.persistence.GeneratorType;
 import javax.persistence.Id;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 
 /**
  * 
  */
 
 @SuppressWarnings("serial")
 @Entity(access = AccessType.PROPERTY) //        
 @Table   //   
 public class Person implements java.io.Serializable {
 
   // Fields
 
   private Integer id;
 
   private String name;
 
   private String sex;
 
   private Integer age;
 
   private List list = new LinkedList();
 
   // Constructors
   /** default constructor */
   public Person() {
   }
 
   /** constructor with id */
   public Person(Integer id) {
     this.id = id;
   }
 
   // Property accessors
   @Id
   public Integer getId() {
     return this.id;
   }
 
   public void setId(Integer id) {
     this.id = id;
   }
 
   @Basic
   public String getName() {
     return this.name;
   }
 
   public void setName(String name) {
     this.name = name;
   }
 
   @Basic
   public String getSex() {
     return this.sex;
   }
 
   public void setSex(String sex) {
     this.sex = sex;
   }
 
   @Basic
   public Integer getAge() {
     return this.age;
   }
 
   public void setAge(Integer age) {
     this.age = age;
   }
   @Transient  //                       Transient  
   public List getList() {
     return list;
   }
 
   public void setList(List list) {
     this.list = list;
   }
 
 }
 このエンティティクラスの属性はデフォルト値を使用しています。Test.javaコードはhbm.xmlマッピングファイルを必要としません。簡単なものではありません。いくつかの単純化は主要目的ではないと思われます。主にEJB 3の恒久化メカニズムを知ることができます。開発の効率を高めることが重要です。はい、この例はもう終わりました。いかがでしたか?バッチに来てください。PS:作成したデータベーステーブルとプログラム実行後のデータベースの状況は以下の通りです。
mysql>describe person、+-------------------------------------------------------------------------------------------------------------------------------------------------- Field  | Type          | Null  | Key 124 Default 124          Extra+--------------------------------------------------------------------------------------------------ハング        | int(11)       | NO.   | PRI_NULL    | autoincrement𞓜name  | varrhar(255)イエロー  |     | NULL    |                || sex    | varrhar(255)イエロー  |     | NULL    |                || メッセージ    | int(11)      | YES  |     | NULL    |                || person int(11)      | YES  | MUL 124 NULL    |                |+--------+--------------+------+-----+---------+----------------+5ローws in set(0.00 sec)mysql>select*from person;+----------------------------------------------------------------------------++++|id name    |  sex 124  age person+----------------------------------------------------------------------------++++(+124;)  1|icerain 124; male 124;   19|   NULL+-----------------------------------------1 row in set(0.03 sec)