引入
安裝配置
基本概念和CURD
HQL和Criteria
關聯映射
繼承映射
集合映射
懶加載
緩存
事務
其餘
Hibernate不適合的場景
與JPA的集成(annotation方式)
最佳實踐
java
模型不匹配(阻抗不匹配)
Java面嚮對象語言,對象模型,其主要概念有:繼承、關聯、多態等;數據庫是關係模型,其主要概念有:表、主鍵、外鍵等。
解決辦法
1使用JDBC手工轉換。
2使用ORM(Object Relation Mapping對象關係映射)框架來解決,主流的ORM框架有Hibernate、TopLink、OJB。
數據庫
基本代碼和CRUD緩存
Java代碼
1.初始化代碼(只作一次)
Configuration cfg = new Configuration();
cfg.configure(「config.cfg.xml」);
也能夠經過cfg.setProperty設置屬性。
SessionFactory sessionFactory = cfg.buildSessionFactory();
2.模板代碼
Session session = null;Transaction tx = null;
try{
session = sessionFactory.openSession();
tx = session.beginTransaction();
//…你的代碼save,delete,update,get…
tx.commit();
}catch(Exception e){
if(tx !=null)tx.rollback();throw e;
}finally{
if(session != null)session.close();
}
session
HQL(Hibernate Query Language)
面向對象的查詢語言,與SQL不一樣,HQL中的對象名是區分大小寫的(除了JAVA類和屬性其餘部分不區分大小寫);HQL中查的是對象而不是和表,而且支持多態;HQL主要經過Query來操做,Query的建立方式:
Query q = session.createQuery(hql);
from Person
from User user where user.name=:name
from User user where user.name=:name and user.birthday < :birthday app
Criteria
Criteria是一種比HQL更面向對象的查詢方式;Criteria的建立方式:
Criteria crit = session.createCriteria(DomainClass.class);
簡單屬性條件如:criteria.add(Restrictions.eq(propertyName, value)),
criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName))框架
關聯映射分佈式
多對一(Employee - Department)
一對多(Department-Employee)
一對一(room - door)
多對多(teacher - student)
組件映射(User-Name)
集合映射(set, list, map, bag)
inverse和cascade(Employee – Department) ui
……spa
分佈式緩存和中央緩存。
使用緩存的條件
1.讀取大於修改。
2.數據量不能超過內存容量。
3.對數據要有獨享的控制。
4.能夠容忍出現無效數據。
hibernate
事務
JDBCTransaction
單個數據庫(一個SesisonFactory對應一個數據庫),由JDBC實現。
Session session = null;
Transaction tx =null;
try {
session = sessionFactory.openSession();
tx = session.beginTransaction();
//process
tx.commit();
} catch(HibernateException e){
if(tx != null)tx.rollback();throw e;
}finally {
if (session != null)session.close();
}
connection.setAutoCommit(false);
connection.commit();conn.rollback();
JTATransaction
能夠簡單的理解成跨數據庫的事務,由應用JTA 容器實現;使用JTATransaction須要配置hibernate.transaction.factory_class參數,該參數缺省值是org.hibernate.transaction. JDBCTransactionFactory,當使用JTATransaction時須要將該參數改爲org.hibernate.transaction.JTATransactionFactory,並配置jta.UserTransaction參數JNDI名(Hibernate在啓動JTATransaction時要用該值到JNDI的上下文Context中去找javax.transaction.UserTransaction)。
javax.transaction.UserTransactin tx = context.lookup(「jndiName」);
try{
tx.begin();
//多個數據庫的session操做;
//session1….
//session2….
tx.commit();
}catch(Exception e){
tx.rollback(); throw e;
}
session context和事務邊界 用current_session_context_class屬性來定義context(用sessionFactory.getCurrentSession()來得到session),其值爲:1.thread:ThreadLocal來管理Session實現多個操做共享一個Session,避免反覆獲取Session,並控制事務邊界,此時session不能調用close當commit或rollback的時候session會自動關閉(connection.release_mode:after_transaction)。 Open session in view:在生成(渲染)頁面時保持 session打開。2.jta:由JTA事務管理器來管理事務(connection.release_mode:after_statement)。悲觀鎖和樂觀鎖 悲觀鎖由數據庫來實現;樂觀鎖hibernate用version和timestamp來實現