锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 閫氳繃璁劇疆hibernate鏄犲皠鏂囦歡鐨刢lass澶?dynamic-insert="true" dynamic-update="true" 鍜宲roperty 閲岄潰鐨刬nsert="false" update="false" 瀹炵幇 . 涓ゅ閮借閰嶇疆錛?/p> <property></property>鏍囩灞炴э細update=”true|false” 濡傛灉璁劇疆涓篺alse,鍒欏湪hibernate鐨剈pdate璇彞閲岄潰娌℃湁<property>鏍囩鎵鎸囨槑鐨勫睘鎬ф墍瀵瑰簲鐨勫瓧孌點?/p> 鍚岀悊錛宨nsert=”true|false” 濡傛灉璁劇疆涓篺alse,鍒欏湪hibernate鐨刬nsert璇彞閲岄潰娌℃湁<property>鏍囩鎵鎸囨槑鐨勫睘鎬ф墍瀵瑰簲鐨勫瓧孌點?/p> 榪欐牱鐨勫紛绔槸鏃犳硶浠庤〃鍗曚笂濉啓淇℃伅浜嗐?/p> 杞嚜錛?/span>http://www.cnblogs.com/abllyboy/archive/2010/12/23/1914577.html 寤虹珛濂芥暟鎹簱鍚庯紝鐐瑰嚮涓涓敭錛屼唬鐮佸氨鐢熸垚浜嗭紝榪欏疄鍦ㄦ槸浠藉崄鍒嗘儸鎰忕殑浜嬫儏錛屽墠闈㈡湁浠嬬粛Hibernate Tools灝卞彲浠ョ敓鎴愪唬鐮侊紝閭d箞鎴戜滑鎬庝箞鍒╃敤瀹冩潵鐢熸垚浠g爜鍛€?/p> 涓嬮潰灝辨妸璇︾粏姝ラ璐村嚭鏉ワ紝鍚屾牱錛屾湁鍥炬湁鐪熺浉銆?/p> Step1錛氬畨瑁呭ソHibernate Tools錛屽緩绔嬩竴涓狣ynamic web project,絎旇呭伐紼嬪悕涓?#8220;HibernateTest” Step2錛氱瑪璁頒互Mysql涓虹ず渚嬶紝鎵浠ュ畨瑁呬竴涓狹ysql錛屽緩绔嬬浉搴旀祴璇曟暟鎹簱鍙婅〃錛屼笅鍥句負絎旇呯殑鏁版嵁搴撳強琛?/p> Step3錛氬皢MySql鐨凧dbc椹卞姩鎷瘋礉鑷砽ib鐩綍錛岀瑪鑰呯殑涓簃ysql-connector-java-5.1.14-bin.jar錛屽彲浠ュ幓Mysql瀹樼綉涓嬭澆 Step4錛氬埄鐢℉ibernate Tools鐢熸垚hibernate.cfg.xml鏂囦歡錛屽涓嬪浘錛?/p> 鐐瑰嚮鍚庡彲浠ュhibernate.cfg.xml鍛戒護錛屼笉綆″畠鐩存帴榛樿杞埌涓嬩竴姝ョ殑閰嶇疆鐣岄潰錛岀瑪鑰呯殑閰嶇疆濡備笅鍥撅細 鐐瑰嚮瀹屾垚鍚庯紝瀹冨皢鐢熸垚濡備笅xml鐨勯厤緗枃浠?/p> Step5錛欻ibernate Console 閰嶇疆 a.鍙抽敭宸ョ▼錛岀偣鍑籖un as-Run Configurations榪涘叆濡備笅鐣岄潰騫墮夋嫨Hibernate Console Configuration錛?/p> b.鏂板緩涓涓狢onfigure鍚嶄負HibernateConsole錛屽悕瀛楀彲闅忎釜浜虹埍濂芥潵鍛藉悕 絎旇呭悇鏍囩欏甸厤緗涓嬶細 Step6:鍒╃敤Hibernat Tools鐢熸垚reveng.xml a.宸ョ▼涓彸閿涓嬪浘錛屾坊鍔爎eveng.xml b.娌″暐璇寸殑鍛戒釜鍚嶏紝閫夋嫨鏀劇疆浣嶇疆 c.鎸夌収綆ご鏂瑰悜榪涜鎿嶄綔錛岄夋嫨console鐨勯厤緗紝鍐嶇偣鍑誨埛鏂幫紝灝辮兘鐪嬪埌鏁版嵁搴撲腑鐨勮〃錛屽皢瀹冧滑Include榪涙潵錛屽涓嬪浘 d:鏈緇堟晥鏋?/p> Step7:榪欐槸鏈鍚庝竴姝ヤ簡錛屾縺鍔ㄤ漢蹇冪殑鏃跺埢灝辮鍒頒簡 a.鍦‥clipse鐨勫伐鍏鋒爮涓皢Hibernate Code Generate鏄劇ず鍑烘潵錛屾樉紺哄嚭鏉ュ悗鐐瑰嚮Hibernate Code Generate Configurations錛屽涓嬪浘: b.Main鏍囩欏典腑閫夋嫨鎺у埗鍙幫紝閫夋嫨鏂囦歡杈撳嚭璺緞錛屽寘鍚嶏紝reveng.xml鏂囦歡 c.Exporters鏍囩欏碉紝閫夋嫨瑕佺敓鎴愮殑鏂囦歡錛岃寰楀嬀涓奌ebernate xml Mappings鍙奌ebernate xml Configuration,瀹冧滑灝嗚嚜鍔ㄧ敓鎴愭槧灝勬枃浠跺茍娉ㄥ唽錛?/p> 閰嶇疆濂藉悗錛岀偣鍑籖un鍗沖彲鐢熸垚浠g爜銆?/p> 澶у姛鍛婃垚錛屾渶鍚庣殑鐢熸垚鐨勪唬鐮佺粨鏋勫涓嬪浘錛?/p> 鎰熻阿浣犵殑闃呰錛屽笇鏈涙湰鏂囧浣犳湁鐢紒
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
]]>
Java綾諱腑瀛楁鐨勭被鍨嬩負 java.util.Date
<property name="createdDate" type="timestamp" >
<column name="CREATED_DATE" />
</property>
鏄犲皠鏂囦歡涓璸roperty鍏冪礌鐨則ype灞炴у間負 timestamp .
]]>
<class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"
dynamic-insert="true" dynamic-update="true">
<id name="adDepartmentId" type="long">
<column name="AD_DEPARTMENT_ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">AD_DEPARTMENT_SEQ</param>
</generator>
</id>
<property name="departmentName" type="string">
<column name="DEPARTMENT_NAME" length="50" not-null="true" />
</property>
<property name="active" type="java.lang.Character" insert="false" update="true">
<column name="ACTIVE" length="1" />
</property>
<property name="createdTime" type="date" insert="false" update="false">
<column name="CREATED_TIME" length="7" />
</property>
<property name="createdUser" type="string">
<column name="CREATED_USER" length="20" not-null="true" />
</property>
<many-to-one name="parentDepartment" column="PARENT_DEPARTMENT_ID"/>
<set name="childDepartment" cascade="save-update" lazy="true" inverse="true">
<key column="PARENT_DEPARTMENT_ID"/>
<one-to-many class="org.gecs.hibernate.test.AdDepartment"/>
</set>
</class>
</hibernate-mapping>
琛ㄧ粨鏋勶細
AdDepartment department = new AdDepartment();
department.setDepartmentName("鑿崡璩囪▕铏?);
department.setCreatedUser("bob");
AdDepartment child_department = new AdDepartment();
child_department.setDepartmentName("PCBA鎳夌敤緋葷當閮?);
child_department.setCreatedUser("bob");
child_department.setParentDepartment(department);
//
department.getChildDepartment().add(child_department);
Transaction tran = session.beginTransaction();
session.save(department);
//session.save(child_department);
tran.commit();
}
鏁堟灉錛?/span>
]]>
<class name="org.gecs.hibernate.test.AdDepartment" table="AD_DEPARTMENT" schema="BARCODE"
dynamic-insert="true" dynamic-update="true">
<id name="adDepartmentId" type="long">
<column name="AD_DEPARTMENT_ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">AD_DEPARTMENT_SEQ</param>
</generator>
</id>
<property name="departmentName" type="string">
<column name="DEPARTMENT_NAME" length="50" not-null="true" />
</property>
<property name="active" type="java.lang.Character" insert="false" update="true">
<column name="ACTIVE" length="1" />
</property>
<property name="createdTime" type="date" insert="false" update="false">
<column name="CREATED_TIME" length="7" />
</property>
<property name="createdUser" type="string">
<column name="CREATED_USER" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
]]>
]]>
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.unbind(InitialContext.java:416)
at org.hibernate.impl.SessionFactoryObjectFactory.removeInstance(SessionFactoryObjectFactory.java:116)
at org.hibernate.impl.SessionFactoryImpl.close(SessionFactoryImpl.java:806)
at org.hibernate.test.junit.UserTest.tearDown(UserTest.java:43)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
<session-factory name="foo">
<property name="hibernate.connection.url">jdbc:oracle:thin:@10.240.144.25:1521:MES</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.username">*****</property>
<property name="hibernate.connection.password">*****</property>
<property name="dialect">org.hibernate.dialect.OracleDialect</property>
<property name="show_sql">true</property>
<mapping resource="org/hibernate/test/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
鍘熷洜錛?lt;seesion-factory>鍏冪礌澶氫簡灞炴?name.
]]>
http://sourceforge.net/projects/hibernate/files/
鍏堝喅鏉′歡錛?/font>
宸茬粡瀹夎浜?/span>ant鍜?/span>MySQL鏁版嵁搴擄紝鏁版嵁搴撹〃宸茬粡寤虹珛銆?/span>
1銆?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 浠?/span>Hibernate瀹樻柟緗戠珯涓嬭澆Middlegen-Hibernate鍜?/span>hibernate-extensions錛屽茍瑙e帇銆?/span>
2銆?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 閰嶇疆Middlegen-Hibernate:
2.1 閰嶇疆鏁版嵁搴撹繛鎺?/span>
鍋囪榪炴帴鐨勬暟鎹簱鏄?/span>MySQL錛屽湪Middlegen-Hibernate-r5\config\database鐩綍涓湁涓涓?/span>mysql.xml鏂囦歡錛屾槸鐢ㄦ潵閰嶇疆MySQL鏁版嵁搴撶殑榪炴帴鐨勩傚唴瀹逛負錛?/span>
<property name="database.script.file" value="${src.dir}/sql/${name}-mysql.sql"/>
<property name="database.driver.file" value="${lib.dir}/mysql-connector-java-3.0.15-ga-bin.jar"/>
<property name="database.driver.classpath" value="${database.driver.file}"/>
<property name="database.driver" value="org.gjt.mm.mysql.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost/jboss"/>
<property name="database.userid" value="jboss"/>
<property name="database.password" value="jboss"/>
<property name="database.schema" value=""/>
<property name="database.catalog" value=""/>
<property name="jboss.datasource.mapping" value="mySQL"/>
灝?/span>mysql-connector-java-3.0.15-ga-bin.jar鎷瘋礉鍒?/span>${lib.dir}錛屼篃灝辨槸Middlegen-Hibernate-r5\lib鐩綍銆?/span>
淇敼閰嶇疆鏂囦歡涓殑鏁版嵁搴撹繛鎺ラ」鐩?/span>database.url銆?/span>database.userid銆?/span>database.userid 浣?/span>Middlegen-Hibernate鍙互鎵懼埌鏁版嵁搴撱?/span>
2.2 閰嶇疆Middlegen-Hibernate-r5鐨?/span>ant榪愯鏂囦歡build.xml
<!DOCTYPE project [
<!ENTITY database SYSTEM "file:./config/database/mysql.xml">
]>
鎸囧嚭浣跨敤鐨勬暟鎹簱閰嶇疆鏂囦歡銆?/font>
<project name="Middlegen Hibernate" default="all" basedir=".">
<property file="${basedir}/build.properties"/>
<property name="name" value="hibernatesample"/>
鎸囧嚭浣犵殑搴旂敤鍚嶇О銆?/font>
<property name="build.gen-src.dir" value="C:/sample"/>
鎸囧嚭hbm鐨勮緭鍑鴻礬寰勩?/span>
<hibernate
destination="${build.gen-src.dir}"
package="org.hibernate.sample"
genXDocletTags="false"
genIntergratedCompositeKeys="false"
javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>
鎸囧嚭hbm鎵鍦ㄧ殑鍖呯殑浣嶇疆銆?/span>
鎸囧嚭hbm.xml涓槸鍚﹂渶瑕?/span>XDoclet Tags銆?/span>
3銆?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 榪愯Middlegen-Hibernate:
鍦?/span>Middlegen-Hibernate鐩綍涓嬭繍琛?/span>ant錛岃繘鍏?/span>Middlegen-Hibernate鐨勫浘褰㈢晫闈€傚彲浠ヨ緗〃錛屽拰瀛楁鐨勭壒鎬с傜劧鍚庢寜Genarate錛屼駭鐢?/span>hbm.xml鏂囦歡銆?/span>
4銆?span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 閰嶇疆hibernate-extensions
鍦?/span>hibernate-extensions-2.1.2\tools\bin鐩綍鏈変竴涓?/span>setenv.bat鏂囦歡錛屾敼鍙樺叾鍐呭涓猴細
set JDBC_DRIVER=C:\java\Middlegen-Hibernate-r5\lib\mysql-connector-java-3.0.15-ga-bin.jar
set HIBERNATE_HOME=C:\java\hibernate-2.1.6
set CORELIB=%HIBERNATE_HOME%\lib
set LIB=..\lib
set PROPS=%HIBERNATE_HOME%\src
set CP=%JDBC_DRIVER%;%PROPS%;%HIBERNATE_HOME%\hibernate2.jar;%CORELIB%\commons-logging-1.0.4.jar;%CORELIB%\commons-collections-2.1.1.jar;%CORELIB%\commons-lang-1.0.1.jar;%CORELIB%\cglib-full-2.0.2.jar;%CORELIB%\dom4j-1.4.jar;%CORELIB%\odmg-3.0.jar;%CORELIB%\xml-apis.jar;%CORELIB%\xerces-2.4.0.jar;%CORELIB%\xalan-2.4.0.jar;%LIB%\jdom.jar;%LIB%\..\hibernate-tools.jar
娉ㄦ剰綰㈣壊瀛椾綋鎻愮ず鐨勫潎鏄礬寰勫拰JAR鏂囦歡鍚嶏紝涓瀹氳姝g‘銆?/span>
5銆佽繍琛?/span>hibernate-extensions錛屾牴鎹?/span>hbm.xml浜х敓POJO鏂囦歡
鍦?/span>DOS涓繍琛?/span>hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string"/>
<set name="courses"
table="student_course"
cascade="save-update"
>
<key column="stu_id"/>
<many-to-many class="model.Course
column="course_id"/>
</set>
<class>
</hibernate-mapping>
澶氬澶氬叧緋婚渶瑕侀厤緗殑灞炴ф瘮杈冨涓浜涖傚垵瀛﹁呯粡甯鎬細鎶?lt;key column=""/>鍜?lt;column="">鐨勫?br />
寮勫弽浜嗭紝鍏跺疄鍙璁頒綇涓涓師鍒欙細<key column="">鎬繪槸鍜屾湰韜被鐨勪富閿甶d瀵瑰簲錛岃?lt;column="">
鎬繪槸涓庡叧鑱旂被鐨勪富閿甶d鐩稿搴斻傚浜庝笂闈㈢殑Student.hbm.xml,鍏寵仈綾繪槸Course,鏈韓綾誨垯鏄疭tudent
Course.hbm.xml
...
<hibernate-mapping>
<class name="model.Course" table="course">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<propery name="name" type="string"/>
<set name="students"
table="student_course"
cascade="save-update"
>
<key columm="course_id"/>
<many-to-many class="model.Student"
column="stu_id"/>
</set>
</class>
</hibernate-mapping>
娉ㄦ剰錛歋tudent涓嶤ourse鐨刢ascade閮借緗負save-update錛屽湪澶氬澶氱殑鍏崇郴涓紝all,delete絳?br />
cascade鏄病鏈夋剰涔夌殑錛屽洜涓哄瀵瑰鍏崇郴涓紝騫朵笉鑳藉洜涓虹埗瀵硅薄琚垹闄わ紝鑰岄犳垚琚寘鎷殑瀛愬璞?br />
琚垹闄わ紝鍥犱負鍙兘榪樻湁鍏朵粬鐨勭埗瀵硅薄鍙傝冧簡榪欎釜瀛愬璞°?/span>
鍙﹀錛屽湪澶氬澶氬叧緋諱腑錛屽鏋滃弻鏂歸兘鏈夋帶鍒舵潈錛堜篃灝辨槸鍙屾柟閮芥病鏈夎緗甶nverse="true"錛夛紝鍒?br /> 鍙屾柟閮借鎶婂叧鑱斿叧緋誨弽鏄犲埌鏁版嵁搴撱傚繀欏誨湪鏌愪竴鏂硅緗甶nverse="true"錛岀劧鍚庡湪鎵ц璇彞鏃朵嬌鐢?br /> 涓繪帶鏂硅繘琛屾搷浣滐紙涔熷氨鏄病鏈夎緗甶nverse="true"鐨勯偅涓鏂癸級銆?/strong>
鍗曞悜鍏寵仈
鍙屽悜鍏寵仈
鏈妭涓嬌鐢ㄥ埌涓や釜綾伙紝鍒嗗埆鏄彮綰?Team)鍜屽鐢?Student)錛屽鐢熷拰鐝駭涔嬮棿鏄瀵逛竴
鍏崇郴銆?br />
鍏蜂綋鐨勫叧鑱斿疄鐜版簮浠g爜濡備笅錛?br />
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string'/>
<many-to-one name="team"
class="model.Team"
column="team_id" <!--鍜宼eam鍙戠敓鍏寵仈鐨勫垪鍚?->
cascade="none"
fetch="join"
/>
</class>
</hibernate-mapping>
<many-to-one>鏍囩鍏鋒湁column灞炴э紝column灞炴ф繪槸鍜屽叧鑱旂被錛堝浜嶴tudent鏉ヨ錛屽叧鑱旂被
鏄疶eam錛夌殑涓婚敭id 鐩稿搴旓紝鍥犳Hibernate浼氭牴鎹畇tudent琛ㄤ腑鐨則eam_id錛屾牴鎹甌eam琛ㄤ腑璁劇疆
鐨刬d鍒楋紙涓鑸儏鍐靛垪鍚嶄篃鍙玦d錛夛紝鍙栧嚭team.id=student.team_id鐨勮褰曪紝鏋勯犳垚Team瀵硅薄榪?br />
鍥炵粰Student綾匯?/strong>
Team.hbm.xml
...
<hibernate-mapping>
<class name="model.Team" table="team" lazy="true">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="teamName" type="string"/>
<set name="students" cascade="save-update" lazy="true" inverse="true">
<key column="team_id"/>
<one-to-many class="model.Student"/>
</set>
</class>
</hibernate-mapping>
Team瀵筍tudent鏄竴瀵瑰鍏崇郴錛屼竴瀵瑰鍏鋒湁<key column=""/>灞炴э紝key鏍囩鎬繪槸鍜屾湰韜被鐨勪富閿?br />
鐩稿搴斻傚湪鍙栧緱Team瀵硅薄鏃訛紝閫氳繃Team鐨勪富閿甶d涓嶴tudent琛ㄤ腑鐨則eam_id榪涜鍖歸厤錛屽鏋?br />
team.id=student.team_id錛屽垯璁や負姝ゅ鐢熸槸鏈彮綰х殑錛屼簬鏄姞杞藉鐢燂紝鎶婂鐢熷璞″姞鍏eam
瀵硅薄鐨勫鐢熼泦鍚堛?/strong>
璁劇疆inverse鏍囩
鐢變簬鍦═eam.hbm.xml涓緗簡inverse="true",Team鍜孲tudent涔嬮棿鐨勫叧緋昏漿鐢盨tudent鏉ョ淮鎶?br />
鍥犳錛屽綋Team鎺屾彙緇存姢鏉冩椂(inverse="false"鎴栬呴粯璁ょ姸鎬侊級錛屽畠璐熻矗灝嗚嚜宸辯殑id鍛婅瘔Student
錛岀劧鍚嶩ibernate鍙戦乽pdate璇彞鍘繪洿鏂拌褰曘備絾鐜板湪璁劇疆浜唅nverse="true"涔嬪悗錛岀淮鎶ゆ潈鍦?br />
Student鎵嬩腑錛屼簬鏄疕ibernate涓嶅啀鍙戦乽pdate璇彞錛岃岀敱Student鑷姩鍘誨彇寰梩eam_id錛岃岃繖涓?br />
鍔ㄤ綔鍏跺疄灝辨槸瀹屾垚涓涓?#8220;瀛︾敓娣誨姞鐝駭”鍔ㄤ綔錛屼篃灝辨槸璇彞newStu.setTeam(team)銆?/p>
浠ヤ富閿叧鑱?br />
涓婚敭鍏崇郴鐨勯噸鐐規槸錛氬叧鑱旂殑涓や釜瀹炰綋鍏變韓涓涓富閿箋?br />
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true"><!--鎶婄被鍜岃〃鍏寵仈璧鋒潵-->
<id name="id" unsaved-value="null"><!--id鐨勪駭鐢熸柟寮忔槸uuid.hex-->
<generator class="uuid.hex"/>
</id>
<property name="name" type="sring"/>
<one-to-one name="cer"
class="model.Certificate"
fetch="join"
cascade="all"
/><!--鏄犲皠瀵瑰簲鐨勮韓浠借瘉瀵硅薄-->
</class>
</hibernate-mapping>
Certificate.hbm.xml
...
<hibernate-mapping>
<class name="model.Certificate" table="certificate" lazy="true">
<id name="id">
<!--澶栭敭鐢熸垚鏈哄埗錛屽紩鐢╯tu瀵硅薄鐨勪富閿綔涓篶ertificate鏁版嵁琛ㄧ殑涓婚敭鍜屽閿?->
<generator class="foreign">
<param name="property">stu</param>
</generator>
</id>
<one-to-one name="stu"
class="model.Student"
constrained="true" <!--琛ㄧずCertificate寮曠敤浜唖tu鐨勪富閿綔涓哄閿?->
/>
</class>
</hibernate-mapping>
涓婅堪鐨勪袱涓厤緗枃浠跺湪<one-to-one>鏍囩涓兘娌℃湁璁劇疆column灞炴?br /> 錛堝疄闄呬笂<one-to-one>鏍囩鏈韓灝辨病鏈塩olumn灞炴э級銆?br />
浠ュ閿叧鑱?/em>
浠ュ閿叧鑱旂殑閲嶇偣鏄細涓や釜瀹炰綋鍚勮嚜鏈変笉鍚岀殑涓婚敭錛屼絾鍏朵腑涓涓疄浣撴湁涓涓閿紩鐢?br />
浜嗗彟涓涓〃鐨勪富閿?/p>
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student" lazy="true">
<id name="id" nusaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="sring"/>
<one-to-one name="cer"
class="model.Certificate"
fetch="join"
cascade="all"
/><!--鏄犲皠瀵瑰簲鐨勮韓浠借瘉瀵硅薄-->
</class>
</hibernate-mapping>
鍙互鐪嬪埌Student.hbm.xml鍜屼互涓婚敭鍏寵仈鏃剁殑浠g爜鏄竴鏍風殑錛屽茍娌℃湁鏀瑰彉銆?/p>
Certificate.hbm.xml
...
<hibernate-mapping>
<class name="model.Certificate" table="certificate" lazy="true">
<id name="id">
<generator class="uuid.hex"/> <!--涓嶅啀鏄痜oreign浜?->
</id>
<many-to-one name="stu"
class="model.Student"
unique="true" <!--鍞竴鐨勫瀵逛竴錛屽叾瀹炰篃灝卞彉鎴愪簡涓瀵逛竴鍏崇郴-->
column="stu_id"
/>
</class>
</hibernate-mapping>
浠ュ閿叧鑱旂殑涓瀵逛竴錛屽叾瀹炴湰璐ㄤ笂鍙樻垚浜嗕竴瀵瑰鐨勫弻鍚戝叧鑱斾簡錛岀紪鍐欐椂鐩存帴
鎸夌収涓瀵瑰鍜屽瀵逛竴鐨勮姹傜紪鍐欙紝鏈鍚庡湪many-to-one榪欎竴杈逛笂鍔犱笂涓涓?br />
unique="true"鍗沖彲銆?/p>
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20))); |
detachedCriteria.getExecutableCriteria(session).list(); |
HibernateTemplate.execute(new HibernateCallback() { 銆public Object doInHibernate(Session session) throws HibernateException { 銆銆.... 銆} } |
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); departmentManager.findByCriteria(detachedCriteria); |
public List findByCriteria(final DetachedCriteria detachedCriteria) { 銆return (List) getHibernateTemplate().execute(new HibernateCallback() { 銆銆public Object doInHibernate(Session session) throws HibernateException { 銆銆銆Criteria criteria = detachedCriteria.getExecutableCriteria(session); 銆銆銆return criteria.list(); 銆銆} 銆}); } |
Criteria criteria = detachedCriteria.getExecutableCriteria(session); return criteria.list(); |
private boolean exposeNativeSession = false; ... |
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session)); |
public Criteria getExecutableCriteria(Session session) { 銆impl.setSession( (SessionImpl) session ); // 瑕佹眰SessionImpl錛孲pring浼犻掔殑鏄疨roxy 銆return impl; } |
public List findByCriteria(final DetachedCriteria detachedCriteria) { 銆return (List) getHibernateTemplate().execute(new HibernateCallback() { 銆銆public Object doInHibernate(Session session) throws HibernateException { 銆銆銆Criteria criteria = detachedCriteria.getExecutableCriteria(session); 銆銆銆return criteria.list(); 銆銆} 銆}, true); } |
涓瀵瑰銆佸瀵瑰錛堟湯绔負澶氾級鐨勬儏鍐碉細鍦ㄩ泦鍚堢殑閰嶇疆涓緗紝浠?set 涓轟緥錛屽涓嬫墍紺猴細
<set name="students" inverse="true" cascade="all" lazy="false" batch-size="2" ><!-- 涓瀵瑰鐨勫歡榪熷姞杞借緗?-->
<key>
<column name="TEAMID" length="32" not-null="true" />
</key>
<one-to-many class="edu.dgut.ke.model.Student" />
</set>
涓瀵逛竴銆佸瀵逛竴錛堟湯绔負涓錛夌殑鎯呭喌錛氬鏋滆瀵規湯绔負涓鐨勫叧鑱旇緗壒閲忓姞杞斤紝瑕佸湪“涓”榪欑鐨勯厤緗枃浠朵腑榪涜璁劇疆錛屾瘮濡傚鐢熷韜喚璇侊紝瑕佸疄鐜板鐝駭鐨勬壒閲忓姞杞斤紝搴旇緗涓?br />
<class name="edu.dgut.ke.model.Certificate" table="CERTIFICATE" lazy="true" batch-size="10" >
嫻嬭瘯渚嬪瓙
1.涓嶇A綾誨property1鍦ㄩ厤緗枃浠墮噷鏄粈涔堢瓥鐣?鍙兘鏄鍏堟姄鍙?绔嬪嵆鎴栧歡榪熸绱?瀹冧滑閮藉け鏁?,榪欐椂閮介噰鐢℉QL鎸囧畾鐨勫乏澶栬繛鎺?宸﹀榪炴帴蹇呭畾浼氬垵濮嬪寲property1灞炴?鎴栧璞?,浣嗘槸濡傛灉閰嶇疆鏂囦歡閲屽property1鐨勬绱㈢瓥鐣ユ槸寤惰繜鍔犺澆,A綾誨緱 鍒板properyt1鐨勫紩鐢?涓轟簡寰楀埌榪欎釜寮曠敤,闇瑕佸啀嬈″彂閫佷竴鏉QL璇彞鏉ョ‘绔嬭繖縐嶅紩鐢ㄥ叧緋?榪欑鎯呭喌鍦╬roperty1涓洪泦鍚堟椂緇忓父鍑虹幇.
2.A綾誨湪閰嶇疆鏂囦歡涓緗殑瀵筽roperty2鐨勯鍏堟姄鍙栫瓥鐣ュ皢琚拷鐣?/strong>(涓嶇榪欎釜絳栫暐鏄痜etch鎴栨槸select),瀵筽roperty2鏈夊獎鍝嶇殑璁劇疆鏄珛鍗沖拰寤惰繜鍔犺澆,hibernate鍙湅寰楀埌榪欎袱縐嶇瓥鐣?鎵浠ュ湪浣跨敤璇彞"from A as a left outer join a.property1"鏃?property2鐨勫姞杞界瓥鐣ュ皢浠呯敱lazy="true"鎴栬呮槸lazy="false"鏉ュ喅瀹?nbsp;
Team.hbm.xml
... ...
<set name="students" inverse="true" cascade="all" lazy="true" fetch="join"><!-- 涓瀵瑰鐨勫歡榪熷姞杞借緗?-->
<key>
<column name="TEAMID" length="32" not-null="true" />
</key>
<one-to-many class="edu.dgut.ke.model.Student" />
</set>
... ...
Student.hbm.xml
... ...
<many-to-one name="certificate"
class="edu.dgut.ke.model.Certificate"
unique="true"
column="cardId"
cascade="all"
lazy="false"
fetch="join">
</many-to-one>
<many-to-one name="team" class="edu.dgut.ke.model.Team" fetch="join">
<column name="TEAMID" length="32" not-null="true" />
</many-to-one>
... ...
嫻嬭瘯浠g爜
Session session = HibernateSessionFactory.getSession();
List list = session.createQuery("from Student as s left join s.team").list();
HibernateSessionFactory.closeSession();
//list 鍖呮嫭涓や釜闀垮害涓?鐨勬暟緇?姣忎竴涓暟緇勪腑鍖呮嫭涓涓鐢熷璞″拰涓涓彮綰у璞?br />
Object[] stuAndTeam1 = (Object[]) list.get(0);
Student stu = (Student) stuAndTeam1[0];
System.out.println(stu.getStudentname());
System.out.println(stu.getTeam().getTeamname());
System.out.println(stu.getTeam().getStudents().size());
鍙栧? full.classname.of.Dialect
鍙栧? SCHEMA_NAME
鍙栧? jndi/composite/name
鍙栧? true | false
鍙栧? 寤鴻璁劇疆涓?tt class="literal">0鍒?tt class="literal">3涔嬮棿
鍙栧? 寤鴻鍊煎湪 5 鍜?30涔嬮棿銆?
鍙栧? true | false
鍙栧? true | false
鍙栧? true | false
鍙栧? 1, 2, 4, 8
鍙栧? classname.of.ConnectionProvider
鍙栧? classname.of.CacheProvider
鍙栧? classname.of.TransactionFactory
鍙栧? jndi/composite/name
鍙栧? classname.of.TransactionManagerLookup
鍙栧? hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
鍙栧? true | false
鍙栧? update | create | create-drop
public class Query {
public static void main(String[] args) {
//鎵撳紑Session鍙栧緱Student瀵硅薄,鍚庡叧闂璖ession
Student student = getStudent();
//鎵撳紑鍙︿竴涓猄ession.璋冪敤update()鏂規硶,鍥犱負鍦ㄤ笂闈㈢殑Session鍏抽棴鍚?
//student瀵硅薄鎴愪簡鑴辯鐘舵?鍦ㄥ彟涓涓猄ession涓棤娉曞垵濮嬪寲涓涓劚綆″璞?蹇呴』閲嶆柊鍏寵仈
HibernateSessionFactory.getSession().update(student.getTeam());
//浣跨敤initialize鏂規硶鍒濆鍖栦竴涓唬鐞嗗璞℃垨鑰呴泦鍚?姝や唬鐞嗗茍涓嶈兘淇濊瘉鍐呴儴宓屽鐨勫璞℃垨鑰呴泦鍚堣鍒濆鍖?
Hibernate.initialize(student.getTeam());
System.out.println(student.getTeam().getTeamname());
HibernateSessionFactory.closeSession();
}
...
public static Student getStudent() {
StudentDAO studentDAO = new StudentDAO();
Session session = studentDAO.getSession();
Student student = (Student) session.get(Student.class, "2c9ab2d516056609011605660e7e0001");
session.close();
return student;
}
...
}
寰堝紼嬪簭闇瑕佸湪鏌愪釜浜嬪姟涓幏鍙栧璞★紝鐒跺悗灝嗗璞″彂閫佸埌鐣岄潰灞傚幓鎿嶄綔錛屾渶鍚庡湪涓涓柊鐨勪簨鍔′繚瀛樻墍鍋氱殑淇敼銆?鍦ㄩ珮騫跺彂璁塊棶鐨勭幆澧冧腑浣跨敤榪欑鏂瑰紡錛岄氬父浣跨敤闄勫甫鐗堟湰淇℃伅鐨勬暟鎹潵淇濊瘉榪欎簺“闀?#8220;宸ヤ綔鍗曞厓涔嬮棿鐨勯殧紱匯?
Hibernate閫氳繃鎻愪緵浣跨敤Session.update()鎴?tt class="literal" style="color: #0000ff">Session.merge()鏂規硶 閲嶆柊鍏寵仈鑴辯瀹炰緥鐨勫姙娉曟潵鏀寔榪欑妯″瀷銆?
// in the first session Cat cat = (Cat) firstSession.load(Cat.class, catId); Cat potentialMate = new Cat(); firstSession.save(potentialMate); // in a higher layer of the application cat.setMate(potentialMate); // later, in a new session secondSession.update(cat); // update cat secondSession.update(mate); // update mate
濡傛灉鍏鋒湁catId鎸佷箙鍖栨爣璇嗙殑Cat涔嬪墠宸茬粡琚?tt class="literal">鍙︿竴Session(secondSession)瑁呰澆浜嗭紝 搴旂敤紼嬪簭榪涜閲嶅叧鑱旀搷浣?reattach)鐨勬椂鍊欎細鎶涘嚭涓涓紓甯搞?
濡傛灉浣犵‘瀹氬綋鍓峴ession娌℃湁鍖呭惈涓庝箣鍏鋒湁鐩稿悓鎸佷箙鍖栨爣璇嗙殑鎸佷箙瀹炰緥錛屼嬌鐢?tt class="literal">update()銆?濡傛灉鎯抽殢鏃跺悎騫朵綘鐨勭殑鏀瑰姩鑰屼笉鑰冭檻session鐨勭姸鎬侊紝浣跨敤merge()銆?/strong> 鎹㈠彞璇濊錛屽湪涓涓柊session涓氬父絎竴涓皟鐢ㄧ殑鏄?tt class="literal">update()鏂規硶錛屼互渚夸繚璇侀噸鏂板叧鑱旇劚綆?detached)瀵硅薄鐨勬搷浣滈鍏堣鎵ц銆?
甯屾湜鐩稿叧鑱旂殑鑴辯瀵硅薄錛堥氳繃寮曠敤“鍙埌杈?#8221;鐨勮劚綆″璞★級鐨勬暟鎹篃瑕佹洿鏂板埌鏁版嵁搴撴椂錛堝茍涓斾篃浠呬粎鍦ㄨ繖縐嶆儏鍐碉級錛?搴旂敤紼嬪簭闇瑕佸璇ョ浉鍏寵仈鐨勮劚綆″璞″崟鐙皟鐢?tt class="literal">update() 褰撶劧榪欎簺鍙互鑷姩瀹屾垚錛屽嵆閫氳繃浣跨敤浼犳挱鎬ф寔涔呭寲(transitive persistence)錛岃鐪?a title="11.11. 浼犳挱鎬ф寔涔呭寲(transitive persistence)" tppabs="http://www.hibernate.org/hib_docs/v3/reference/zh-cn/html/objectstate.html#objectstate-transitive">絎?nbsp;11.11 鑺?“浼犳挱鎬ф寔涔呭寲(transitive persistence)”銆?
lock()鏂規硶涔熷厑璁哥▼搴忛噸鏂板叧鑱旀煇涓璞″埌涓涓柊session涓娿備笉榪囷紝璇ヨ劚綆?detached)鐨勫璞″繀欏繪槸娌℃湁淇敼榪囩殑錛?
//just reassociate: sess.lock(fritz, LockMode.NONE); //do a version check, then reassociate: sess.lock(izi, LockMode.READ); //do a version check, using SELECT ... FOR UPDATE, then reassociate: sess.lock(pk, LockMode.UPGRADE);
璇鋒敞鎰忥紝lock()鍙互鎼厤澶氱LockMode錛?鏇村淇℃伅璇烽槄璇籄PI鏂囨。浠ュ強鍏充簬浜嬪姟澶勭悊(transaction handling)鐨勭珷鑺傘傞噸鏂板叧鑱斾笉鏄?tt class="literal">lock()鐨勫敮涓鐢ㄩ斻?
鍏朵粬鐢ㄤ簬闀挎椂闂村伐浣滃崟鍏冪殑妯″瀷浼氬湪絎?nbsp;12.3 鑺?“涔愯騫跺彂鎺у埗(Optimistic concurrency control)”涓璁恒?
鏂囩珷鍑哄:http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/objectstate.html鍒嗛〉鏀寔綾伙細
鎶借薄涓氬姟綾?
鐢ㄦ埛鍦╳eb灞傛瀯閫犳煡璇㈡潯浠禿etachedCriteria錛屽拰鍙夌殑startIndex錛岃皟鐢ㄤ笟鍔ean鐨勭浉搴攆indByCriteria鏂規硶錛岃繑鍥炰竴涓狿aginationSupport鐨勫疄渚媝s銆?/p>
ps.getItems()寰楀埌宸插垎欏靛ソ鐨勭粨鏋滈泦
ps.getIndexes()寰楀埌鍒嗛〉绱㈠紩鐨勬暟緇?
ps.getTotalCount()寰楀埌鎬葷粨鏋滄暟
ps.getStartIndex()褰撳墠鍒嗛〉绱㈠紩
ps.getNextIndex()涓嬩竴欏電儲寮?
ps.getPreviousIndex()涓婁竴欏電儲寮?br />
鏂囩珷鍑哄:http://www.javaeye.com/topic/14657
q void delete(Object entity)錛氬垹闄ゆ寚瀹氭寔涔呭寲瀹炰緥
q deleteAll(Collection entities)錛氬垹闄ら泦鍚堝唴鍏ㄩ儴鎸佷箙鍖栫被瀹炰緥
q find(String queryString)錛氭牴鎹?/span>HQL鏌ヨ瀛楃涓叉潵榪斿洖瀹炰緥闆嗗悎
q findByNamedQuery(String queryName)錛氭牴鎹懡鍚嶆煡璇㈣繑鍥炲疄渚嬮泦鍚?/span>
q get(Class entityClass, Serializable id)錛氭牴鎹富閿姞杞界壒瀹氭寔涔呭寲綾葷殑瀹炰緥
q save(Object entity)錛氫繚瀛樻柊鐨勫疄渚?/span>
q saveOrUpdate(Object entity)錛氭牴鎹疄渚嬬姸鎬侊紝閫夋嫨淇濆瓨鎴栬呮洿鏂?/span>
q update(Object entity)錛氭洿鏂板疄渚嬬殑鐘舵侊紝瑕佹眰entity鏄寔涔呯姸鎬?/span>
q setMaxResults(int maxResults)錛氳緗垎欏電殑澶у皬
涓嬮潰鏄竴涓畬鏁?/span>DAO綾葷殑婧愪唬鐮侊細
public class PersonDAOHibernate implements PersonDAO
{
//閲囩敤log4j鏉ュ畬鎴愯皟璇曟椂鐨勬棩蹇楀姛鑳?/span>
private static Log log = LogFactory.getLog(NewsDAOHibernate.class);
//浠ョ鏈夌殑鎴愬憳鍙橀噺鏉ヤ繚瀛?/span>SessionFactory銆?/span>
private SessionFactory sessionFactory;
//浠ョ鏈夊彉閲忕殑鏂瑰紡淇濆瓨HibernateTemplate
private HibernateTemplate hibernateTemplate = null;
//璁懼兼敞鍏?/span>SessionFactory蹇呴渶鐨?/span>setter鏂規硶
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
//鍒濆鍖栨湰DAO鎵闇鐨?/span>HibernateTemplate
public HIbernateTemplate getHibernateTemplate()
{
//棣栧厛錛屾鏌ュ師鏉ョ殑hibernateTemplate瀹炰緥鏄惁榪樺瓨鍦?/span>
if ( hibernateTemplate == null)
{
//濡傛灉涓嶅瓨鍦紝鏂板緩涓涓?/span>HibernateTemplate瀹炰緥
hibernateTemplate = new HibernateTemplate(sessionFactory);
}
return hibernateTemplate;
}
//榪斿洖鍏ㄩ儴鐨勪漢鐨勫疄渚?/span>
public List getPersons()
{
//閫氳繃HibernateTemplate鐨?/span>find鏂規硶榪斿洖Person鐨勫叏閮ㄥ疄渚?/span>
return getHibernateTemplate().find("from Person");
}
/**
* 鏍規嵁涓婚敭榪斿洖鐗瑰畾瀹炰緥
* @ return 鐗瑰畾涓婚敭瀵瑰簲鐨?/span>Person瀹炰緥
* @ param 涓婚敭鍊?/span>
public News getNews(int personid)
{
return (Person)getHibernateTemplate().get(Person.class, new Integer(personid));
}
/**
* @ person 闇瑕佷繚瀛樼殑Person瀹炰緥
*/
public void savePerson(Person person)
{
getHibernateTemplate().saveOrUpdate(person);
}
/**
* @ param personid 闇瑕佸垹闄?/span>Person瀹炰緥鐨勪富閿?/span>
* /
public void removePerson(int personid)
{
//鍏堝姞杞界壒瀹氬疄渚?/span>
Object p = getHibernateTemplate().load(Person.class, new Integer(personid));
//鍒犻櫎鐗瑰畾瀹炰緥
getHibernateTemplate().delete(p);
}
}
q Object execute(HibernateCallback action)
q List execute(HibernateCallback action)
榪欎袱涓柟娉曢兘闇瑕佷竴涓?/span>HibernateCallback鐨勫疄渚嬶紝HibernateCallback瀹炰緥鍙湪浠諱綍鏈夋晥鐨?/span>Hibernate鏁版嵁璁塊棶涓嬌鐢ㄣ傜▼搴忓紑鍙戣呴氳繃HibernateCallback錛屽彲浠ュ畬鍏ㄤ嬌鐢?/span>Hibernate鐏墊椿鐨勬柟寮忔潵璁塊棶鏁版嵁搴擄紝瑙e喅Spring灝佽Hibernate鍚庣伒媧繪т笉瓚崇殑緙洪櫡銆?/span>HibernateCallback鏄竴涓帴鍙o紝璇ユ帴鍙e彧鏈変竴涓柟娉?/span>doInHibernate(org.hibernate.Session session)錛岃鏂規硶鍙湁涓涓弬鏁?/span>Session銆?/span>
閫氬父錛岀▼搴忎腑閲囩敤瀹炵幇HibernateCallback鐨勫尶鍚嶅唴閮ㄧ被鏉ヨ幏鍙?/span>HibernateCallback鐨勫疄渚嬶紝鏂規硶doInHibernate鐨勬柟娉曚綋灝辨槸Spring鎵ц鐨勬寔涔呭寲鎿嶄綔銆傚叿浣撲唬鐮佸涓嬶細
public class PersonDaoImpl implements PersonDao
{
//縐佹湁瀹炰緥鍙橀噺淇濆瓨SessionFactory
private SessionFactory sessionFactory;
//渚濊禆娉ㄥ叆蹇呴』鐨?/span>setter鏂規硶
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
/**
* 閫氳繃浜哄悕鏌ユ壘鎵鏈夊尮閰嶈鍚嶇殑Person瀹炰緥
* @param name 鍖歸厤鐨勪漢鍚?/span>
* @return 鍖歸厤璇ヤ換鍛界殑鍏ㄩ儴Person闆嗗悎
*/
public List findPersonsByName(final String name)
{
//鍒涘緩HibernateTemplate瀹炰緥
HibernateTemplate hibernateTemplate =
new HibernateTemplate(this.sessionFactory);
//榪斿洖HibernateTemplate鐨?/span>execute鐨勭粨鏋?/span>
return (List) hibernateTemplate.execute(
//鍒涘緩鍖垮悕鍐呴儴綾?/span>
new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException
{
//浣跨敤鏉′歡鏌ヨ鐨勬柟娉曡繑鍥?/span>
List result = session.createCriteria(Person.class)
.add(Restrictions.like(“name”, name+”%”)
.list();
return result;
}
});
}
}
娉ㄦ剰錛氭柟娉?/span>doInHibernate鏂規硶鍐呭彲浠ヨ闂?/span>Session錛岃Session瀵硅薄鏄粦瀹氬埌璇ョ嚎紼嬬殑Session瀹炰緥銆傝鏂規硶鍐呯殑鎸佷箙灞傛搷浣滐紝涓庝笉浣跨敤Spring鏃剁殑鎸佷箙灞傛搷浣滃畬鍏ㄧ浉鍚屻傝繖淇濊瘉瀵逛簬澶嶆潅鐨勬寔涔呭眰璁塊棶錛屼緷鐒跺彲浠ヤ嬌鐢?/span>Hibernate鐨勮闂柟寮忋?/span>
涓銆?span style="font: 7pt 'Times New Roman'"> 鏁版嵁搴撲簨鍔℃蹇?/span>
鏁版嵁搴撲簨鍔$殑鐗瑰緛錛?/span> ACID
Atomic 錛堝師瀛愭э級銆?/span> Consistency 錛堜竴鑷存э級銆?/span> Isolation 錛堥殧紱繪э級鍜?/span> Durability 錛堟寔涔呮э級銆?/span> DBMS 鐢ㄦ棩蹇楁潵淇濊瘉鏁版嵁鐨勫師瀛愭с佷竴鑷存у拰鎸佷箙鎬э紱鐢ㄩ攣鐨勬満鍒舵潵淇濊瘉鏁版嵁鐨勯殧紱繪с?/span>
浜屻?span style="font: 7pt 'Times New Roman'"> 浜嬪姟鐨勮竟鐣?/span>
鏁版嵁搴撴敮鎸?/span> 2 縐嶄簨鍔℃ā寮忥細鑷姩鎻愪氦鍜屾墜鍔ㄦ彁浜ゃ?/span>
JDBC API 鐨勪簨鍔¤竟鐣?/span>
Hibernate API 澹版槑浜嬪姟杈圭晫
娉細涓涓?/span> session 鍙互瀵瑰簲澶氫釜浜嬪姟錛屼絾鏄帹鑽愮殑鍋氭硶鏄竴涓?/span> session 瀵瑰簲涓涓簨鍔°?/span>
涓夈?/font>
澶氫簨鍔$殑騫跺彂闂褰撳涓簨鍔″悓鏃惰闂浉鍚岀殑鏁版嵁鐨勬椂鍊欙紝紼嬪簭濡傛灉娌℃湁閲囧彇閫傚綋鐨勯殧紱繪帾鏂斤紝灝變細鍙戠敓鏁版嵁搴撶殑騫跺彂闂銆傚父瑙佺殑騫跺彂闂鏈夛細
絎竴綾諱涪澶辨洿鏂幫細鎾ゆ秷浜嬪姟鐨勬椂鍊欙紝鎶婂叾浠栫殑浜嬪姟宸茬粡鎻愪氦鐨勬暟鎹粰瑕嗙洊浜嗭紱
鑴忚錛涜浜嗘病鏈夋彁浜ょ殑鏁版嵁錛?/span>
铏氳錛氫竴涓簨鍔¤鍒板彟澶栦竴涓簨鍔″凡緇忔彁浜ょ殑鏂版彃鍏ョ殑鏁版嵁錛?/span>
涓嶅彲閲嶅璇伙細涓涓簨鍔¤鍒板彟澶栦竴涓簨鍔″凡緇忔彁浜ょ殑鏇存柊鐨勬暟鎹紱
絎簩綾諱涪澶辨洿鏂幫細涓涓簨鍔¤鐩栧彟澶栦竴涓簨鍔″凡緇忔彁浜ょ殑鏇存柊鏁版嵁銆?/span>
鍥涖?/strong> 閿?/span>
涓鑸湴錛屽ぇ鍨嬬殑 DBMS 閮戒細鑷姩鐨勭鐞嗛攣瀹氭満鍒訛紝浣嗘槸鍦ㄥ鏁版嵁鐨勫畨鍏ㄦс佸畬鏁存у拰涓鑷存ф湁鐗規畩瑕佹眰鐨勫湴鏂癸紝鍙互鐢變簨鍔℃湰韜潵綆$悊鐞愮殑鏈哄埗銆?/span>
鏈変竴鐐硅鍏蟲敞鐨勬槸錛氶攣鐨勭矑搴﹁秺澶э紝闅旂鎬ц秺濂斤紝騫跺彂鎬ц秺宸?/span>
鎸夌収閿佺殑紼嬪害鏉ュ垎鏈夛細
鍏變韓閿侊細鐢ㄨ鎿嶄綔錛岄潪鐙崰鐨勶紝鍏朵粬浜嬪姟鍙互璇伙紝浣嗘槸涓嶈兘鏇存柊錛屽茍鍙戞уソ錛?/span>
鐙崰閿侊細鐢ㄤ笌 insert update 鍜?/span> delete 絳夎鍙ワ紝鍏朵粬浜嬪姟涓嶈兘璇伙紝涔熶笉鑳芥敼錛屽茍鍙戞у樊錛?/span>
鏇存柊閿侊細鎵ц update 鐨勬椂鍊欙紝鍔犻攣銆?/span>
姝葷悙錛氬鏄簨鍔″垎鍒攣瀹氫簡涓涓祫婧愶紝鍙堣姹傞攣瀹氬鏂瑰凡緇忛攣瀹氱殑璧勬簮錛屽氨閫犳垚浜嗚姹傜幆銆?/span>
闄嶄綆姝婚攣鐨勬渶濂藉姙娉曟槸浣跨敤鐭簨鍔°?/span>
浜斻?/font> 鏁版嵁搴撶殑浜嬪姟闅旂綰у埆
鏁版嵁搴撴彁渚?/span> 4 縐嶄簨鍔¢殧紱葷駭鍒細
Serializable 錛氫覆琛屽寲錛涳紙闅旂綰у埆鏈楂橈級 1
Repeatable Read 錛氬彲閲嶅璇伙紱 2
Read Commited 錛氳宸叉彁浜ゆ暟鎹紱 4
Read Uncommited 錛氳鏈彁浜ゆ暟鎹紱錛堥殧紱葷駭鍒渶浣庯級 8
Hiberate 涓殑闅旂綰у埆鐨勮緗?/span>
鍦?/span> Hibernate 鐨勯厤緗枃浠朵腑 hibernate.connection.isolation=2
鍏?/font> 鎮茶閿佸拰涔愯鐞?/span>
浠庡簲鐢ㄧ▼搴忕殑瑙掑害鏉ョ湅錛岄攣鍒嗕負鎮茶閿佸拰涔愯閿併?/span>
鎮茶閿侊細鏄劇ず鐨勪負紼嬪簭鍔犻攣錛屼絾鏄檷浣庡茍鍙戞с?/span>
Select ……. For update;
鍦?/span> Hibernate 涓殑浠g爜
Session.get(Account.class,net Long(1),LockMode.UPGRADE) 錛?/span> // 紼嬪簭閲囩敤鎮茶閿?/span>
涔愯閿侊細渚濋潬 DBMS 鏉ョ鐞嗛攣錛岀▼搴忎緷闈犵増鏈帶鍒舵潵閬垮厤騫跺彂闂銆?/span>
鍦ㄥ璞?/span> - 鍏崇郴鏄犲皠鐨勬枃浠朵腑錛岀敤 <version> 鎴栬?/span> <timestamp> 鍙互綆$悊騫跺彂銆備箰瑙傜悙姣旀偛瑙傜悙鏈夋洿濂界殑騫跺彂鎬э紝浼樺厛鑰冭檻涔愯鐞愩?/span>
Hibernate 鎻愪緵浜?/span> 3 縐嶆绱㈢瓥鐣ワ細
l 寤惰繜媯绱紱
l 绔嬪嵆媯绱紱
l 榪垏宸﹀榪炴帴錛?/span>
Hibernate 鎻愪緵 2 縐嶆柟寮忔潵紜畾媯绱㈢瓥鐣ワ紝涓涓槸鍦ㄩ厤緗枃浠跺綋涓紝鍙﹀涓縐嶆槸鍦ㄧ▼搴忕璁劇疆銆傚綋鐒訛紝濡傛灉浣犲湪紼嬪簭涓緗簡媯绱㈢瓥鐣ワ紝閭d箞浣犲湪閰嶇疆鏂囦歡涓殑璁劇疆涔熷氨鏃犳晥浜嗐傚彟澶栫殑涓縐嶆儏鍐墊槸 HQL 浼氬拷鐣ラ厤緗枃浠剁殑璁劇疆錛岃屾繪槸閲囩敤榪垏宸﹀榪炴帴銆?/span>
涓銆?綾葷駭鍒殑媯绱?/span>
鍙互閫夋嫨鐨勬绱㈢瓥鐣ユ槸绔嬪嵆媯绱㈠拰寤惰繜媯绱紝榛樿鐨勬槸绔嬪嵆媯绱€傜敤閰嶇疆鏂囦歡涓殑 <class> 鑺傜偣鐨?/span> lazy 鏉ユ帶鍒躲?/span>
娉ㄦ剰錛氫笉綆′綘鍦ㄩ厤緗?/span> class 鐨?/span> lazy 鏄?/span> true 榪樻槸 false 錛屽 get() 鍜?/span> create Criteria () 鏂規硶閮戒笉璧蜂綔鐢紝鍙湁瀵?/span> load() 鏂規硶璧蜂綔鐢ㄣ?/span>
褰撲綘浣跨敤鐨勬绱㈢瓥鐣ユ槸 lazy 鐨勬椂鍊欙紝褰撲綘鎵ц
Customer customer = (Customer)session.load(Customer.class,new Long(1));
鐨勬椂鍊欙紝 Hibernate 涓嶄粠鏁版嵁搴撴绱㈡暟鎹紝鑰屽彧鏄駭鐢熶竴涓唬鐞嗙被錛屽彧鏈夊綋浣犳墽琛?/span>
Customer.getName();
鐨勬椂鍊欙紝 Hibernate 鎵嶅埌鏁版嵁搴撳彇鏁版嵁銆傛墍浠ワ紝濡備笅鐨勪唬鐮佹槸浼氳鎶涘嚭寮傚父鐨勶細
get() 鏂規硶鎬繪槸鐢ㄧ殑绔嬪嵆媯绱紝濡傛灉鍜屽畠鐩稿叧鑱旂殑綾諱篃鏄敤鐨勭珛鍗蟲绱紝閭d箞涔熶細鎶婄浉鍏寵仈鐨勬暟鎹篃媯绱㈠嚭鏉ャ?/span>
浜屻?涓瀵瑰拰澶氬澶氬叧鑱旀绱?/span>
涓鑸湴錛屼負浜嗘湁鍑忓皯瀵規暟鎹簱鐨勮闂紝鎴戜滑寰寰鐢ㄥ歡榪熸绱㈢殑絳栫暐銆傛墍浠ワ紝鎴戜滑浼樺厛浣跨敤濡備笅鏂瑰紡錛?/span>
<set class=”order” inverse=”true’ lazy=”true” >
浣嗘槸錛屾垜浠湪媯绱?#8220;澶?#8221;鐨勪竴鏂圭殑鏃跺欙紝 Hibernate 涓嶈兘涓烘垜浠駭鐢熶唬鐞嗙被銆傜敱姝わ紝鎴戜滑灝辮鐢?/span> betch-size 鐨勯厤緗潵鍑忓皯 SQL 璇彞銆?/span>
褰撴垜浠嬌鐢?/span> outer-join 灞炴х殑鏃跺欙紝鎴戜滑灝辨病鏈夊繀瑕佷嬌鐢?/span> lazy 灞炴т簡銆?/span> Outer-join 浼氫竴嬈″皢“涓”鏂瑰拰涓庝箣鐩稿叧鐨?#8220;澶?#8221;鏂圭敤宸﹀榪炴帴鐨勬柟寮忔绱㈠嚭鏉ャ?/span>
Session session = sessionFactory.openSession();
Transaction tx = null;
tx = session.beginTransaction();
Customer customer = (Customer)session.get(Customer.class,new Long(1));
浜х敓鐨?/span> SQL 璇彞濡備笅錛?/span>
Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.SessionFactory;
import cn.hxex.blog.hibernate.HibernateUtil;
public class HibernateFilter implements Filter {
private static Log log = LogFactory.getLog(HibernateFilter.class);
/**
* 榪囨護鍣ㄧ殑涓昏鏂規硶
* 鐢ㄤ簬瀹炵幇Hibernate浜嬪姟鐨勫紑濮嬪拰鎻愪氦
*/
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException
{
// 寰楀埌SessionFactory瀵硅薄鐨勫疄渚?br> SessionFactory sf = HibernateUtil.getSessionFactory();
try
{
// 寮濮嬩竴涓柊鐨勪簨鍔?br> log.debug("Starting a database transaction");
sf.getCurrentSession().beginTransaction();
log.debug( "Request Path:\t" + ((HttpServletRequest)request).getServletPath() );
// Call the next filter (continue request processing)
chain.doFilter(request, response);
// 鎻愪氦浜嬪姟
log.debug("Committing the database transaction");
sf.getCurrentSession().getTransaction().commit();
}
catch (Throwable ex)
{
ex.printStackTrace();
try
{
// 鍥炴粴浜嬪姟
log.debug("Trying to rollback database transaction after exception");
sf.getCurrentSession().getTransaction().rollback();
}
catch (Throwable rbEx)
{
log.error("Could not rollback transaction after exception!", rbEx);
}
// 鎶涘嚭寮傚父
throw new ServletException(ex);
}
}
/**
* Servlet榪囨護鍣ㄧ殑鍒濆鍖栨柟娉?br> * 鍙互璇誨彇閰嶇疆鏂囦歡涓緗殑閰嶇疆鍙傛暟
*/
public void init(FilterConfig filterConfig) throws ServletException {}
/**
* Servlet鐨勯攢姣佹柟娉?br> * 鐢ㄤ簬閲婃斁榪囨護鍣ㄦ墍鐢寵鐨勮祫婧?br> */
public void destroy() {}
}
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
public class BaseModel implements Serializable{
/**
* The Generated SerialVersionUID
*/
private static final long serialVersionUID = 7766184319541530720L;
/**
* The identify of the object
*/
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/**
* Common implement equals method
*/
public boolean equals( Object obj )
{
if( this==obj ) return true;
if( !( obj instanceof BaseModel ) )
return false;
BaseModel target = (BaseModel)obj;
if( this.getId()!=null && this.getId().length()>0 )
{
return this.getId().equals( target.getId() );
}
if( target.getId()!=null && target.getId().length()>0 )
{
return false;
}
return EqualsBuilder.reflectionEquals(this, obj);
}
/**
* Generate the hash code
*/
public int hashCode()
{
if( this.getId()!=null && this.getId().length()>0 )
{
return this.getId().hashCode();
}
return HashCodeBuilder.reflectionHashCode(this);
}
/**
* Common implement toString method
*/
public String toString()
{
return ReflectionToStringBuilder.toString( this );
}
}
equals()鏂規硶,鐢ㄤ簬鍒ゆ柇涓や釜瀵硅薄鏄惁鐩哥瓑,浣嗗茍涓嶆槸鍦ㄤ嬌鐢?=="榪涜涓や釜瀵硅薄鏄惁鐩哥瓑鐨勫垽鏂椂璋冪敤.鍥犱負浣跨敤"=="鎵鍒ゆ柇鐨勬槸涓や釜瀵硅薄鐨勫紩鐢ㄦ槸鍚︾浉絳?涔熷彲浠ョ畝鍗曠悊瑙d負涓や釜瀹炰緥鎵寮曠敤鐨勬槸鍚︿負鍐呭瓨涓殑鍚屼竴涓璞?equals()鏂規硶鍙互鐞嗚В涓轟袱涓璞″湪"鍚箟"涓婃槸鍚︾浉絳?涔熷氨鏄榪欎袱涓璞℃墍琛ㄨ揪鐨勬剰鎬濇槸鍚︾浉鍚?equals()鏂規硶鍦ㄥ璞′繚瀛樺埌闆嗗悎瀹瑰櫒綾?Collection)涓椂琚皟鐢?鍥犱負闆嗗悎瀹瑰櫒綾諱笉鍏佽鍏朵腑瀛樺湪涓や釜鐩稿悓瀵硅薄瀹炰緥,鍏跺垽鏂殑渚濇嵁灝辨槸閫氳繃璋冪敤璇ュ疄浣撳璞$殑equals()鏂規硶鏉ヨ繘琛屽垽鏂殑.
濡傛灉淇敼浜唀quals()鏂規硶,灝卞繀欏諱慨鏀筯ashCode()鏂規硶.濡傛灉涓嶈繖鏍風殑璇?灝辮繚鍙峧ava.lang.Object鐨勯氱敤鐨刪ashCode鐨勭害瀹?浠庤屽鑷磋綾繪棤娉曚笌鍩轟簬鏁e垪鍊肩殑闆嗗悎綾諱竴璧鋒甯稿伐浣?
toString()鏂規硶,鐢ㄤ簬灝嗗綋鍓岼ava瀵硅薄鐨勫疄渚嬭漿鎹負鍙互鎻忚堪鍏跺唴瀹圭殑瀛楃涓?榪欎釜鏂規硶鐨勪綔鐢ㄦ槸鍦ㄧ▼搴忚皟璇曠殑榪囩▼鍙互鏂逛究鍦板緱鍒板疄浣撳璞′腑浠や漢鎰熷叴瓚g殑淇℃伅,鏈夊埄浜庢洿鍑嗙‘鍙婃椂鍦板彂鐜扮▼搴忎腑鐨勯棶棰?
瀵逛簬Hibernate 3.1 浠ュ墠鐨勭殑鐗堟湰鍦ㄥ疄鐜癏ibernate宸ュ叿綾繪椂,闇瑕侀氳繃涓や釜綰跨▼
灞閮ㄥ彉閲忔潵淇濆瓨涓庡綋鍓嶈繘琛岀浉瀵瑰簲鐨凷ession鍜屼簨鍔″璞$殑瀹炰緥.
鑰屽浜嶩ibernate 3.1 浠ュ悗鐨勭増鏈?浣跨敤綰跨▼灞閮ㄥ彉閲忎繚瀛楽ession鍜屼簨鍔″璞$殑
宸ヤ綔灝卞畬鍏ㄤ笉闇瑕佽嚜宸卞幓瀹炵幇浜?鍙渶鍦℉ibernate.cfg.xml閰嶇疆鏂囦歡涓鍔犱竴涓悕涓?br>Current_session_context_class鐨勫睘鎬?騫朵笖璁劇疆璇ュ睘鎬х殑鍊間負thread.榪欐牱Hibernate
灝卞彲浠ヨ嚜鍔ㄥ湴浣跨敤綰跨▼灞閮ㄥ彉閲忔潵淇濆瓨褰撳墠鐨勮繘紼嬬殑Session鍜屼簨鍔″璞′簡.
鐩稿簲鍦?Hibernate涔熶負鍏禨ession瀵硅薄澧炲姞浜唃etTransaction()鏂規硶,浠ヤ究鍙互闅忔椂
寰楀埌褰撳墠鐨勪簨鍔″茍榪涜鎻愪氦鎴栬呭洖婊氭搷浣?榪欎釜鏂規硶鍦ㄤ互鍓嶇増鏈殑hibernate涓槸涓嶅瓨鍦?br>鐨?
Hibernate宸ュ叿綾諱富瑕佸寘鎷互涓嬪姛鑳?
(1)Hibernate鐨勫垵濮嬪寲鎿嶄綔
榪欎釜鍔熻兘涓嶆斁鍦ㄤ換浣曟柟娉曚腑,閲囩敤闈欐佺紪鐮佺殑澶勭悊鏂瑰紡,鍦ㄥ璞$殑鍒濆鍖栫殑鏃跺欒
璋冪敤涓嬈″氨鍙互浜?
(2)寰楀埌褰撳墠鐨勯厤緗俊鎭?/em>
榪欎釜鏂規硶鍙互寰楀埌褰撳墠鐨勯厤緗俊鎭?浠ヤ究浜庡姩鎬佽繘琛岄厤緗弬鏁扮殑淇敼.hibernate
鐨勯厤緗俊鎭彧鍦℉ibernate鍒濆鍖栫殑鏃跺欎嬌鐢ㄤ竴嬈?鍦ㄥ畬鎴愬垵濮嬪寲涔嬪悗瀵歸厤緗枃浠?br> 鎴栬匔onfiguration瀵硅薄鎵鍋氱殑淇敼灝嗕笉浼氱敓鏁?
(3)寰楀埌SessionFactory瀵硅薄鐨勫疄渚?/em>
榪欎釜鏂規硶鐢ㄤ簬寰楀埌褰撳墠緋葷粺榪愯鏃剁殑SessionFactory瀵硅薄鐨勫疄渚?榪欎釜瀵硅薄鐨勫疄渚?br> 瀵逛簬鏁翠釜緋葷粺鑰岃█鏄叏灞鍞竴鐨?
(4)閲婃斁鍚勭璧勬簮
榪欎釜鏂規硶鐢ㄤ簬緇堟Hibernate鐨勬姤鍔″悗,閲婃斁鍚勭Hibernate鎵浣跨敤鐨勮祫婧?铏界劧榪欎釜
鏂規硶鍑犱箮涓嶄細鐢ㄥ埌,浣嗗浜庣敵璇瘋祫婧愮殑鍙婃椂閲婃斁鏄瘡涓▼搴忓簲璇ユ帉鎻$殑鍩烘湰鍘熷垯.
(5)閲嶅緩SessionFactory
鐢變簬SessionFactory瀵逛簬鏁翠釜Hibernate搴旂敤鏄敮涓鐨?騫朵笖鏄湪Hibernate鍒濆鍖?br> 涔嬪悗寤虹珛濂界殑,鑰屼笖瀵逛簬閰嶇疆鏂囦歡鐨勪慨鏀逛篃涓嶄細褰卞搷鍒板凡緇忓垵濮嬪寲鐨凷essionFactory
瀵硅薄.閭d箞濡備綍鎵嶈兘浣夸慨鏀圭殑閰嶇疆淇℃伅瀵笻ibernate璧蜂綔鐢ㄥ憿.榪欏氨闇瑕侀噸寤篠essionFactory
瀵硅薄瀹炰緥.
(6)鎷︽埅鍣ㄦ敞鍐?/em>
鐢ㄤ簬娉ㄥ唽鎷︽埅鍣ㄥ茍閲嶅緩SessionFactory.
HibenateUtil.java
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Interceptor;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
/**
* 鍩虹鐨凥ibernate杈呭姪綾伙紝鐢ㄤ簬Hibernate鐨勯厤緗拰鍚姩銆?br> * <p>
* 閫氳繃闈欐佺殑鍒濆鍖栦唬鐮佹潵璇誨彇Hibernate鍚姩鍙傛暟錛屽茍鍒濆鍖?br> * <tt>Configuration</tt>鍜?lt;tt>SessionFactory</tt>瀵硅薄銆?br> * <p>
*
* @author galaxy
*/
public class HibernateUtil
{
private static Log log = LogFactory.getLog(HibernateUtil.class);
// 鎸囧畾瀹氫箟鎷︽埅鍣ㄥ睘鎬у悕
private static final String INTERCEPTOR_CLASS = "hibernate.util.interceptor_class";
// 闈欐丆onfiguration鍜孲essionFactory瀵硅薄鐨勫疄渚嬶紙鍏ㄥ眬鍞竴鐨勶級
private static Configuration configuration;
private static SessionFactory sessionFactory;
static
{
// 浠庣己鐪佺殑閰嶇疆鏂囦歡鍒涘緩SessionFactory
try
{
// 鍒涘緩榛樿鐨凜onfiguration瀵硅薄鐨勫疄渚?br> // 濡傛灉浣犱笉浣跨敤JDK 5.0鎴栬呮敞閲婅浣跨敤new Configuration()
// 鏉ュ垱寤篊onfiguration()瀵硅薄鐨勫疄渚?br> configuration = new Configuration();
// 璇誨彇hibernate.properties鎴栬卙ibernate.cfg.xml鏂囦歡
configuration.configure();
// 濡傛灉鍦ㄩ厤緗枃浠朵腑閰嶇疆浜嗘嫤鎴櫒錛岄偅涔堝皢鍏惰緗埌configuration瀵硅薄涓?br> String interceptorName = configuration.getProperty(INTERCEPTOR_CLASS);
if (interceptorName != null)
{
Class interceptorClass =
HibernateUtil.class.getClassLoader().loadClass(interceptorName);
Interceptor interceptor = (Interceptor)interceptorClass.newInstance();
configuration.setInterceptor(interceptor);
}
if (configuration.getProperty(Environment.SESSION_FACTORY_NAME) != null)
{
// 璁〩ibernate灝哠essionFacory緇戝畾鍒癑NDI
configuration.buildSessionFactory();
}
else
{
// 浣跨敤闈欐佸彉閲忔潵淇濇寔SessioFactory瀵硅薄鐨勫疄渚?br> sessionFactory = configuration.buildSessionFactory();
}
}
catch (Throwable ex)
{
// 杈撳嚭寮傚父淇℃伅
log.error("Building SessionFactory failed.", ex);
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
/**
* 榪斿洖鍘熷鐨凜onfiguration瀵硅薄鐨勫疄渚?br> *
* @return Configuration
*/
public static Configuration getConfiguration()
{
return configuration;
}
/**
* 榪斿洖鍏ㄥ眬鐨凷essionFactory瀵硅薄鐨勫疄渚?br> *
* @return SessionFactory
*/
public static SessionFactory getSessionFactory()
{
SessionFactory sf = null;
String sfName = configuration.getProperty(Environment.SESSION_FACTORY_NAME);
if ( sfName != null)
{
log.debug("Looking up SessionFactory in JNDI.");
try
{
sf = (SessionFactory) new InitialContext().lookup(sfName);
}
catch (NamingException ex)
{
throw new RuntimeException(ex);
}
}
else
{
sf = sessionFactory;
}
if (sf == null)
throw new IllegalStateException( "SessionFactory not available." );
return sf;
}
/**
* 鍏抽棴褰撳墠鐨凷essionFactory騫朵笖閲婃斁鎵鏈夌殑璧勬簮
*/
public static void shutdown()
{
log.debug("Shutting down Hibernate.");
// Close caches and connection pools
getSessionFactory().close();
// Clear static variables
configuration = null;
sessionFactory = null;
}
/**
* 浣跨敤闈欐佺殑Configuration瀵硅薄鏉ラ噸鏂版瀯寤篠essionFactory銆?br> */
public static void rebuildSessionFactory()
{
log.debug("Using current Configuration for rebuild.");
rebuildSessionFactory(configuration);
}
/**
* 浣跨敤鎸囧畾鐨凜onfiguration瀵硅薄鏉ラ噸鏂版瀯寤篠essionFactory瀵硅薄銆?br> *
* @param cfg
*/
public static void rebuildSessionFactory(Configuration cfg)
{
log.debug("Rebuilding the SessionFactory from given Configuration.");
synchronized(sessionFactory)
{
if (sessionFactory != null && !sessionFactory.isClosed())
sessionFactory.close();
if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null)
cfg.buildSessionFactory();
else
sessionFactory = cfg.buildSessionFactory();
configuration = cfg;
}
}
/**
* 鍦ㄥ綋鍓峉essionFactory涓敞鍐屼竴涓嫤鎴櫒
*/
public static SessionFactory registerInterceptorAndRebuild(Interceptor interceptor)
{
log.debug("Setting new global Hibernate interceptor and restarting.");
configuration.setInterceptor(interceptor);
rebuildSessionFactory();
return getSessionFactory();
}
/**
* 鑾峰緱鎷︽埅鍣ㄥ璞?br> *
* @return Interceptor
*/
public static Interceptor getInterceptor()
{
return configuration.getInterceptor();
}
/**
* 鎻愪氦褰撳墠浜嬪姟錛屽茍寮濮嬩竴涓柊鐨勪簨鍔?br> */
public static void commitAndBeginTransaction()
{
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();
}
}