(二)配置及び用法のHibernate


Hibernateはオープンソースのオブジェクト関係マッピングフレームワークで、JDBCを非常に軽量レベルのオブジェクトパッケージ化し、Javaプログラマーがオブジェクトプログラミング思考を自由に使用してデータベースを操作できるようにしています.本文はHibernate 2のいくつかの配置の使い方などを述べて、本文はあまり詳しくなくて分かりやすいかもしれなくて、みんなと一緒に討論して勉強して、本題に入ることを望みます.
Hibernateが現在使用しているパッケージ:
antlr-2.7.6.jar、commons-collections-3.1.jar、dom4j-1.6.1.jar、hibernate3.jar、hibernate-jpa-2.0-api-1.0.0.Final.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-nop-1.6.1.jar
(1)hibernate.cfg.xmlの構成:
<!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="dialect">org.hibernate.dialect.MySQLDialect</property>//SQL  
   <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
   <property name="connection.url">jdbc:mysql://localhost:3306/hibertest?useUnicode=true&amp;characterEncoding=UTF-8</property>
   <property name="connection.username">root</property>
   <property name="connection.password">123</property>
   <property name="hbm2ddl.auto">update</property>//  create,validate,create-drop      
   <property name="show_sql">true</property>//  SQL      
   <!--      -->
   <mapping class="com.xxx.entity.Parent" />//  Annotation    
   <mapping resource="com/xxx/entity/Score.hbm.xml" />//  Score.hbm.xml   		
</session-factory>
</hibernate-configuration>

Hibernateの基本的な応用:
セッションの設定:

	private static Configuration configuration = new Configuration();//Configuration  (      )
	private static SessionFactory sessionFactory;//session  
	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();//    ,       session
	public static SessionFactory getSessionFactory() {
		sessionFactory = configuration.configure().buildSessionFactory();
 //configuration.configure()    classpath (   src)  hibernate.cfg.xml,          configuration.configure("url");
                return sessionFactory;
	}
   
	public static Session getSession() {
		Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {//  session          ,        ,      getSession()       session,               。         ,                 session    。          Session,  Session        。          !
			if (sessionFactory == null) {
				sessionFactory = getSessionFactory();
			}
			session = sessionFactory.openSession();
		}
		threadLocal.set(session);//  session
		return session;
	}
//  :                    Session。

トランザクション・カプセル化の例:

	public static boolean save(Object object) {
		boolean flag = false;
		Transaction tx = null;
		try {
			tx = getSession().beginTransaction();//    
			getSession().save(object);
			tx.commit();//    
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();//    

		} finally {
			if (getSession() != null) {
				getSession().close();
			}
		}
		return flag;
	}

例:使用する永続化クラス:

//Student.class
public class Student {
	private Integer uid;
	private String studentName;
	private Set<Score> score= new HashSet<Score>();//         ,     Set  。
        //private Score score;            ,   Set   。
//getter setter   
}
//Score.class
public class Score {
	private Integer sid;
	private String scoreName;
	private Student student;//   Student     
//getter setter   
}

(2)Score.hbm.xmlの配置:(student.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="com.xxx.entity.Score" table="score" lazy="true">
	<id name="sid" column="sid">//    
		<generator class="native" />//           ,Mysql     
	</id>
    <property name="scoreName" column="scoreName" type="java.lang.String" />
	<many-to-one name="student" class="com.xxx.entity.Student" cascade="all" fetch="select" >//fetch="select",      select,Hibernate     select                 ,         ,       
		<column name="kid" ></column>
	</many-to-one>
  </class>
</hibernate-mapping>

(3)各xmlにおけるラベルの応用を簡単に説明する:

  <!--     -->
  <id name="sid" column="sid" type="java.lang.Integer">//    ,name      id,column       
     <generator class="native" />//           ,Mysql     
     //<generator class="assigned"/>           
  </id> 

  <property name="scoreName" column="scoreName" type="java.lang.String" />//name       ,column  ,type     ,   java.lang.Integer  

<!--     --> Score.hbm.xml 
  <many-to-one name="student" class="com.xxx.entity.Student" cascade="all" fetch="select" >
	<column name="kid" ></column>
  </many-to-one>
//fetch               select    join  ,select                (  ),       id,        select  ,       ,  n+1   ; join  ,                 sql      ,        。(   select),fetch="join",hibernate   select                  ,  lazy   。
//cascade all(      ,   save-update delete),save-update(         ),delete(      ),none(       )
//<column name="kid" ></column>     

<!--         --> Score    ,       ?  
// Score.hbm.xml :
  <id name="sid" column="sid" type="java.lang.Integer">
     <generator class="foreign">
        <param name="property">student</param>//   foreign, Score      Student   , Score     Student     。        。
      </generator>
   </id> 
    <one-to-one name="student" constrained="true"/>//name       ( Score  )constrained="true"           
// one-to-one   property-ref  ,               ,    ,         。
 

<!--          -->
//       ,    student.hbm.xml    Student  Score   
<one-to-one name="score" cascade="all">

<!--          -->//  score.hbm.xml   
<many-to-one cascade="all" name="student" column="sid" not-null="true" unique="true" class="com.xxx.entity.Student"/>
//unique="true"          

<!--       -->
// Student.hbm.xml :
<set name="scores" cascade="save-update" inverse="true">
 <key><column name="tid" not-null="true"></key>//tid   
 <one-to-many class="com.xxx.entity.Score"/>
</set>
//inverse="true"  Student    ,    Score  ,       ,             ,                 ,       ,          ,        。
// Score.hbm.xml :
<many-to-one fetch="select" cascade="save-update" name="student" class="com.xxx.entity.Student">
 <column name="tid" not-null="true"/>
</many-to-one>

(4)Annotation構成Hibernate:

//               ,       ,                ,    ,     !  Annotation     ,     xxx.hbm.xml     ,  hibernate.cfg.xml           ,   hibernate。cgf.xml   
//Student.class    :
@Entity//       
public class Student {
	private Integer uid;
	private String studentName;
	private Set<Score> set = new HashSet<Score>();
	public void setSet(Set<Score> set) {
		this.set = set;
	}
	@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy="student")//      ,     mappedBy="Score   Student   ",     mappedBy,                    ,        ?mappedBy     、   、      。     。cascade         ,PERSIST(    ) REMOVE(    ) REFRESH(    ) MERGE(    ) ALL(    )
	public Set<Score> getSet() {
		return set;
	}

	@Id//  
	@GeneratedValue(strategy = GenerationType.AUTO)//      (  )
	public Integer getUid() {
		return uid;
	}
	public void setUid(Integer uid) {
		this.uid = uid;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
}

//Score.class    :
@Entity
public class Score {
	private Integer sid;
	private String scoreName;
	private Student student;
	@Id//  
	@GeneratedValue//      (      )
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getScoreName() {
		return scoreName;
	}
	public void setScoreName(String scoreName) {
		this.scoreName = scoreName;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
	@JoinColumn(name="tid")//            
	public Student getStudent() {
		return student;
	}

プライマリ・キーによる双方向一対一のAnnotation構成では、出てこないので、分かるようにメッセージを残してほしい.
さて、とりあえずここまで紹介しておきますが、後で徐々にHibernateの構成を改善して、遅延ロードの設定のメリットとデメリットに注意します.Lazy=「true」の場合、Sessionをオフにして取得するとエラーになります.もちろん、いくつかの構成でこの問題を解決して、ネット上で検索することができます.ネット上の資源を十分に利用しなければなりません.
まとめ:(1)主な開発過程hibernate.cfg.xml+xxx.hbm.xml+エンティティクラス
(2)エンティティクラスをAnnotationで構成する場合xxx.hbm.xmlは省略できます.開発モデルはhibernate.cfg.xml+エンティティクラス
(3)hibernate.hbm2ddl.Auto=updateが機能しない場合springのセッションのセッションfactoryに:
   true