zoukankan      html  css  js  c++  java
  • Hibernate

    引入
    安装配置
    基本概念和CURD
    HQL和Criteria
    关联映射
    继承映射
    集合映射
    懒加载
    缓存
    事务
    其他
    Hibernate不适合的场景
    与JPA的集成(annotation方式)
    最佳实践

    模型不匹配(阻抗不匹配)
        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();
    }

    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


    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)


    ……

     

     分布式缓存和中央缓存。
    使用缓存的条件
    1.读取大于修改。
    2.数据量不能超过内存容量。
    3.对数据要有独享的控制。
    4.可以容忍出现无效数据。

    事务

    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来实现

  • 相关阅读:
    MVC过滤器
    MVC自带的校验
    FPGA简单概述
    CAN总线扩展数据帧介绍
    简述人工智能发展的先决条件
    CAN总线标准帧
    CAN总线应用
    CAN总线优点
    CAN总线概述
    高速PCB设计注意事项
  • 原文地址:https://www.cnblogs.com/moonsoft/p/9982579.html
Copyright © 2011-2022 走看看