Hibernate

引入
安裝配置
基本概念和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來實現

相關文章
相關標籤/搜索