(二)配置及び用法の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の構成:
Hibernateの基本的な応用:
セッションの設定:
トランザクション・カプセル化の例:
例:使用する永続化クラス:
(2)Score.hbm.xmlの配置:(student.hbm.xmlは列挙しないで、私はただ大体配置を説明して、具体的な使い方はやはりみんなに実践させて、真理を実践することを望みます!)
(3)各xmlにおけるラベルの応用を簡単に説明する:
(4)Annotation構成Hibernate:
プライマリ・キーによる双方向一対一の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
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&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に: