hibernate 概要

4 篇文章 0 订阅
本文详细介绍了Hibernate的基本概念、配置、数据检索、持久化实现、高级特性等,包括实体映射、数据关联、事务管理、缓存策略、延迟加载、数据保存与批量操作等方面,旨在提供全面的Hibernate学习指南。
摘要由CSDN通过智能技术生成
4, hibernate基础
    4.1  hibernate基础语义
        Configuration
            Configuration config = new Configuration().configure();
            File file = new File("c:\\sample\\myhibernate.xml");
            Configuration config = new Configuration().configure(file);
        SessionFactory
            Configuration config = new Configuration().configure();
            SessionFactory sessionFactory = config.buildSessionFactory();
            采用线程安全的设计,可由多个线程并发调用,大多情况下,一个应用中针对一个数据库
            共享一个sessionFactory实例即可。
        Session
            非线程安全,一个session实例同时可有一个线程实用。
            Session session = sessionFactory.openSession();
            save,get,delete,find(hibernate2),hibernate3-->Query,Criteria
    4.2 基础配置
        SessionFactory配置
            数据库连接配置
            数据库连接池的配置
                默认数据库连接池
                    hibernate.connection.pool_size  2
                c3p0
                dbcp
                proxool
        事务管理
            使用jdbc的事务处理机制
                hibernate.transaction.factory_class
                    net.sf.hibernate.transaction.JDBCTransactionFactory
            实用JTA
                hibernate.transaction.factory_class
                    net.sf.hibernate.transaction.JTATransactionFactory
                jta.UserTransaction jta/usertransaction
            可选配置项
    4.3  hibernate O/R映射
        基本数据类型
        实体映射
            实体映射基础
                表名--类名映射
                主键映射
                字段映射
        高级映射技术
            自定义数据类型
                UserType
                CompositeUserType
        复合主键
            基于实体类属性的复合主键
        blob,clob字段的映射
        实体映射策略
    4.4 数据关联
        一对一
            主键关联
                1,一对一节点映射 , 级联关系
                2,foreign主键生成,一对一映射节点,约束
            唯一外键关联
                1,many-to-one,unique
                2,one-to-one

        一对多
            单向一对多,双向一对多
        多对多
    4.5 hibernate数据检索
        Criteria Query
            复合查询:
                Criteria criteria = session.createCriteria(TUser.class);
                Criteria addrCriteria = criteria.createCriteria("address");
                addrCriteria.add(Expression.like("address","%ShangHai%"));
        DetachedCriteria
            脱离session。
            DetachedCriteria deCriteria = DetachedCriteria.forClass(TUser.class);
            deCriteria.add(Expression.eq("name","...."));

            DetachedCriteria criteria = deCriteria.getExecutableCriteria(session);
            可用于子查询Subqueries.propertyGt("age",avgAge);

            Criteria高级特性:
                1,限定返回的记录范围
                    Criteria criteria = session.createCriteria(TUser.class);
                    criteria.setFirstResult(100);
                    criteria.setMaxResults(20);
                2,分组与统计
                    criteria.setProjection(Projections.groupProperty("age"));
        Hibernate Query Language
    4.6  HQL实用技术
        实体查询
        属性查询
        实体更新与删除
        分组与排序
        参数绑定
        引用查询
            将sql保存在配置文件中,需要调用的时候进行读取。
            Query query = session.getNamedQuery("queryByName");
        联合查询
        子查询
        数据加载方式
        sql查询
    4.7 自定义持久化实现
        <sql-insert>
5.    hibernate高级特性
    5.1 hibernate持久化实现
        实体对象生命周期
        实体对象识别
        数据缓存
        hibernate数据缓存
            内部缓存又称一级缓存

                由hibernate自身维护的。如果需要手动干预:
                    session.evict
                    session.clear
            二级缓存

                可纳入缓存管理中的条件:
                    1,数据不会被第三方应用修改
                    2,数据大小在可接受的范围之内
                    3,数据更新率较低
                    4,同一数据可能会被系统频繁使用
                    5,非关键数据

        事务管理
            基于jdbc事务管理
            基于jta事务管理
                jta提供了跨session的事务管理能力,管理多个session的事务
        悲观锁(....for update 依靠数据库的锁机制实现)
            Criteria.setLockMode
            Query.setLockMode
            Session.lock
        乐观锁(鉴于悲观锁对数据库性能的大量开销,特别是长事务而言。)
            version----比较版本号,提交版本>当前版本,才予以提交。
        
        持久层操作
            数据加载
                session.get/load
                session.find/iterate(2)//session.createQuery().list()/session.createQuery().iterate()(3)

                iterate会先找出id,然后从中找相符的记录。n+1条sql。但它会先去缓存(find出的记录)中读取,
                    这时候也许就是很少的select语句了。

                海量数据的操作:
                    while(it.hasNext()){
                        TUser user = (TUser)it.next();
                        session.evict(user);
                        sessionFactory.evict(TUser.class,user.getId());
                    }
        Query Cache
            保存了之前查询操作执行过的select SQL,以及由此查询产生 的查询结果集。
            如果数据表发生了变化,会自动将Query Cache中对应表的sql缓存废除。

            只在特定的情况下产生:
                1,完全相同的select sql重复执行
                2,在两次查询之间,此select sql对应的库表没有发生过变化。
            如果要应用它,在配置文件中配置:    
                <session-facotry>
                    <property name = "hibernate.cache.use_query_cache">true</property>
                </session-factory>
                之后我们在查询执行之前,query.setCacheable(true);

        延迟加载
            实体对象的延迟加载
                hibernate中引入了CGLib作为代理机制实现的基础,其基本实现原理就是通过
                有CGLib构造一个包含目标对象所有属性和方法的动态对象。通过一个中间代理
                实现了数据延迟加载功能,只有当客户程序真正调用实体类的取值方法时,hibernate
                才会执行数据库查询操作。
            集合类型的延迟加载
                Collection addSet = user.getAddresses();  1
                Iterator it = addSet.iterator();  2

                代码运行至2,真正的数据读取操作才开始执行。

                hibernate 对集合类型的缓存时,首先是这个集合中所有实体的id列表(数据所有)
                然后是各个实体对象。
                <cache usage="read-only/read-write">
                read-only(数据索引,不会将集合中的实体元素同时纳入缓存)
                read-write(实体元素也纳入缓存)
            属性延迟加载
                配置,hibernate3中还需借助类增强器对二进制class文件进行强化处理。

        数据保存
            session.save  会去内部缓存中查找。
            session.update  detached---->persistent
            session.saveOrUpdate
        数据批量操作
            数据批量导入
                <property name = "hibernate.jdbc.batch_size">25</property>
            数据批量删除
                找出符合的id,再循环根据id删除,为了记录状态,删除了那些记录才这样做的。
                这样导致了几个问题:
                1)内存消耗,因为首先必须将所有符合条件的数据加载到内存中。
                    游标的hibernate批量删除:
                        Query query = session.createQuery(hql);
                        ScrollableResults scRes = query.scroll();
                        while(scRes.next()){....}
                2)迭代删除操作的执行效率
                    调整hibernate.jdbc.batch_size参数解决

            无法保证缓存数据的一致有效性。
    Collection类型

        Set  如果做删除操作,会删去符合条件的所有记录,但是我们只想删除特定的记录,那么bag
        Bag 无序可重复(set,list)  先全部删除,然后插入。
        idbag----collection-id
        Map
        List
5.2    hibernate回调与拦截机制

        Interceptor 定义了hibernate中的通用拦截机制。session创建时即可以指定加载
        相应的interceptor,之后此session的持久化操作动作都将首先经由拦截器捕获处理。
        SessionFactory sessionFactory = config.buildSessionFactory();
        Interceptor it = new MyInterceptor();
        session = sessionFactory.openSession(it);

5.3 hibernate 使用技术
        hibernate分页
            setFirstResut   setFetchSize
            dialect:指定了所有底层数据库的对外统一接口。
                实现getLimitString方法。
        Session管理
            ThreadLocal
        Hibernate与Spring Framework
        hibernate 常见优化策略
            1,最新的hibernate版本
            2,制定合理的缓存策略
            3,采用合理的session管理机制  ThreadLocal
            4,尽量使用延迟加载特性
            5,设定合理的批处理参数(batch_size)
            6,如果可能,选用uuid作为主键生成器
            7,如果可能,选用基于version的乐观锁策略代替悲观锁
            8,开发过程中,打开hibernate.show_sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值