1、hibernate的開發流程
創建項目——>基本框架示意圖——>引入hibernate 開發包——> 開發hibernate (有3中方法)——>開發domain對象和對象關係映射文件——>手動配置hibernate.cfg.xml文件
注意:hibernate可以用在JavaSE項目中,也可以用在JavaEE項目中;但是Struts只能用在JavaEE項目中(因爲Struts是web框架)
(1) 創建一個項目
(2)畫出一個簡單項目框架示意圖
(3)引入hibernate 開發包 (從網上下載google hibernate http://www.hibernate.org),完後我們
(4) 開發hibernate 有三種方法(開發順序)
我們使用第二種開發項目
創建employe 表.
create table employee(
id number primary key,
name varchar2(64) not null,
email varchar2(64) not null,
hiredate date not null)
創建一個序列,將來用於主鍵的自增長 :
--創建一個序列
create sequence emp_seq
start with 1
increment by 1
minvalue 1
nomaxvalue
nocycle
nocache
(5) 開發domain對象和對象關係映射文件
對象關係映射文件: 作用是用於指定 domain對象和表的映射關係. ,該文件的取名有規範:domain對象.hbm.xml,一般我們放在 和domain對象同一個文件夾下(包下)
我們的Employee.hbml.xml配置文件 :
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mappingpackage="com.hsp.domain">
<classname="Employee" table="employee">
<!--id元素用於指定主鍵屬性-->
<idname="id" column="id"type="java.lang.Integer">
<!--該元素用於指定主鍵值生成策略hilonative increment sequence uuid -->
<generatorclass="sequence">
<paramname="sequence">emp_seq</param>
</generator>
</id>
<!--對其它屬性還有配置-->
<propertyname="name" type="java.lang.String">
<columnname="name" not-null="false" />
</property>
<propertyname="email" type="java.lang.String" >
<columnname="email" not-null="false"/>
</property>
<propertyname="hiredate" type="java.util.Date">
<columnname="hiredate" not-null="false" />
</property>
</class>
</hibernate-mapping>
(6)手動配置我們的hibernate.cfg.xml文件,該文件用於配置 連接的數據庫的類型,driver,,用戶名,密碼 ,url ....同時管理 對象關係映射文件 ,該文件的名稱,我們一般不修改hibernate.cfg.xml配置文件
<?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>
<!--hibernate 設計者,給我們提供了一寫常用的配置 -->
<!--配置使用的driver-->
<propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<propertyname="connection.username">scott</property>
<propertyname="connection.password">tiger</property>
<propertyname="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orclhsp</property>
<!--配置dialect方言,明確告訴hibernate連接是哪種數據庫 -->
<propertyname="dialect">org.hibernate.dialect.OracleDialect</property>
<!--顯示出對於sql -->
<propertyname="show_sql">true</property>
<!--指定管理的對象映射文件-->
<mappingresource="com/hsp/domain/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
(7) 測試文件TestMain.java
package com.hsp.view;
import com.hsp.util.*;
import java.util.Date;
import org.hibernate.Session;import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.*;
import com.hsp.domain.Employee;
public class TestMain {
/**
* @param args
*/
publicstatic void main(String[] args) {
//查詢[load]->hql語句(hibernate query language)
}
publicstatic void delEmp() {
//刪除
//獲取一個session
Sessionsession=MySessionFactory.getSessionFactory().openSession();
Transactionts=session.beginTransaction();
//刪除1.先獲取該僱員,然後刪除
Employeeemp=(Employee) session.load(Employee.class, 3);
session.delete(emp);
ts.commit();
session.close();
}
publicstatic void updateEmp() {
//TODO Auto-generated method stub
//修改用戶
//獲取一個會話
Sessionsession=MySessionFactory.getSessionFactory().openSession();
Transactionts=session.beginTransaction();
//修改用戶1. 獲取要修改的用戶,2.修改
//load是通過主鍵屬性,獲取該對象實例.<--->表的記錄對應
Employeeemp=(Employee) session.load(Employee.class, 3);
emp.setName("韓順平8");//update...
emp.setEmail("[email protected]");
ts.commit();
session.close();
}
publicstatic void addEmployee() {
//我們使用hibernate完成crud操作[這裏我們只見對象,不見表]
//現在我們不是用service ,直接測試.
//1。創建Configuration,該對象用於讀取hibernate.cfg.xml,並完成初始化
Configurationconfiguration=new Configuration().configure();
//2.創建SessoinFactory[這是一個會話工廠,是一個重量級的對象]
SessionFactorysessionFactory=configuration.buildSessionFactory();
//3.創建Sessoin 相當於jdbc Connection[ serveltHttpSession ,也不是 jspsession]
Sessionsession=sessionFactory.openSession();
//4.對hiberate而言,要求程序員,在進行 增加,刪除,修改的時候使用事務提交,
Transactiontransaction = session.beginTransaction();
//添加一個僱員
Employeeemployee=new Employee();
employee.setName("shunping");
employee.setEmail("[email protected]");
employee.setHiredate(newDate());
//insert.............
//保存
session.save(employee);//saveemployee就是持久化該對象 (把對象保存到了數據庫中稱爲一條記錄)
//==>insertinto ....[被hiberante封裝]
//提交
transaction.commit();
session.close();
}
}
2、hibernate運行原理首先,應用程序先調用Configration類,該類讀取hibernate的配置文件及映射文件中的信息(如果我們使用註解的話則不需要讀取映射文件),並使用這些信息生成一個SessionFactory對象。接着,從SessionFacctory生成一個Session對象,並用Session對象生成Transaction對象。通過Session對象的get()、sava()、update()、delete()和saveOrupdate()等方法對PO進行加載,保存,更新,刪除等操作;在查詢的情況下,可通過Session對象生成一個Query對象,然後利用Query對象執行查詢操作。如果沒有異常,Transaction對象將提交這些操作結果到數據庫中,否則會回滾事務。
http://blog.csdn.net/xiaoyaoyulinger/article/details/52263848
1.通過Configuration config = new Configuration().configure();//讀取並解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析映射信息
3.通過SessionFactory sf = config.buildSessionFactory();//創建SessionFactory
4.Session session = sf.openSession();//打開Sesssion
5.Transaction tx = session.beginTransaction();//創建並啓動事務Transation
6.persistent operate操作數據,持久化操作
7.tx.commit();//提交事務
8.關閉Session
9.關閉SesstionFactory
Hibernate是如何延遲加載?get與load的區別
1. 對於Hibernate get方法,Hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然後在二級緩存中查找,還沒有就查詢數據庫,數據 庫中沒有就返回null。這個相對比較簡單,也沒有太大的爭議。主要要說明的一點就是在這個版本(bibernate3.2以上)中get方法也會查找二級緩存!
2. Hibernate load方法加載實體對象的時候,根據映射文件上類級別的lazy屬性的配置(默認爲true),分情況討論:
(1)若爲true,則首先在Session緩存中查找,看看該id對應的對象是否存在,不存在則使用延遲加載,返回實體的代理類對象(該代理類爲實體類的子類,由CGLIB動態生成)。等到具體使用該對象(除獲取OID以外)的時候,再查詢二級緩存和數據庫,若仍沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
(2)若爲false,就跟Hibernateget方法查找順序一樣,只是最終若沒發現符合條件的記錄,則會拋出一個ObjectNotFoundException。
這裏get和load有兩個重要區別:
如果未能發現符合條件的記錄,Hibernate get方法返回null,而load方法會拋出一個ObjectNotFoundException。
load方法可返回沒有加載實體數據的代 理類實例,而get方法永遠返回有實體數據的對象。
(對於load和get方法返回類型:好多書中都說:“get方法永遠只返回實體類”,實際上並不正 確,get方法如果在session緩存中找到了該id對應的對象,如果剛好該對象前面是被代理過的,如被load方法使用過,或者被其他關聯對象延遲加 載過,那麼返回的還是原先的代理對象,而不是實體類對象,如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據),那麼它會查詢二級緩存或者數 據庫來加載數據,但是返回的還是代理對象,只不過已經加載了實體數據。)
總之對於get和load的根本區別,一句話,hibernate對於 load方法認爲該數據在數據庫中一定存在,可以放心的使用代理來延遲加載,如果在使用過程中發現了問題,只能拋異常;而對於get方 法,hibernate一定要獲取到真實的數據,否則返回null。
Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、
說下Hibernate的緩存機制:
Hibernate的查詢方式
Sql、Criteria,object comptosition
Hql:
1、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
http://www.cnblogs.com/dashi/p/3597969.html