Hibernate【第三章 各类概念】

别来无恙 提交于 2020-01-22 21:31:10

一、如何支持事务

s.beginTransaction(); 
s.getTransaction().commit();

 

二、属性延迟加载

属性的延迟加载:

当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库

 

三、关系延迟加载

Product.hbm.xml中

<set name="users" table="user_product" lazy="true">
    <key column="pid"/>
    <many-to-many column="uid" class="User"/>
</set>

 

四、级联

1、没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉

 

2、4种级联

all:所有操作都执行级联操作;

none:所有操作都不执行级联操作;

delete:删除时执行级联操作;

save-update:保存和更新时执行级联操作;

级联通常用在one-many和many-to-many上,几乎不用在many-one上。

 

五、一级缓存

同一个session中,获取相同对象,仅执行一次sql

 

六、二级缓存

sessionFactory级别

1、hibernate本身不支持二级缓存,需要EhCache提供,修改hibernate.hbm.xml配置

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 

2、src下配置ehcache.xml

<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
</ehcache>

 

3、设置HBM

在要进行二级缓存的实例类上配置:

<hibernate-mapping package="com.how2java.pojo">
    <class name="Category" table="category_">
        <cache usage="read-only" />
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <property name="name" />
 
        <set name="products" lazy="true">
            <key column="cid" not-null="false" />
            <one-to-many class="Product" />
        </set>
                 
    </class>
     
</hibernate-mapping>

 

 

七、实现分页查询

public class TestHibernate {
    public static void main(String[] args) {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        Criteria criteria = session.createCriteria(Product.class);
        String name = "iphone";
        criteria.add(Restrictions.like("name", "%" + name + "%"));
        criteria.setFirstResult(2);
        criteria.setMaxResults(4);

        List<Product> list = criteria.list();
        for (Product p : list) {
            System.out.println(p.getName());
        }

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

八、两种获取方式

get 实时加载属性

load延迟加载,属性被访问时调用sql

1. get方式会返回null

2. load方式会抛出异常

 

九、两种session

Hibernate有两种方式获得session,分别是:

openSession和getCurrentSession

 

他们的区别在于

1. 获取的是否是同一个session对象

openSession每次都会得到一个新的Session对象

getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象

2. 事务提交的必要性

openSession只有在增加,删除,修改的时候需要事务,查询时不需要的

getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭

 

十、返回记录总数

Query q =s.createQuery("select count(*) from Product p where p.name like ?");
        q.setString(0, "%"+name+"%");
        long total= (Long) q.uniqueResult();
        System.out.println(total);

 

十一、乐观锁原理及配置方法

1、脏数据出现场景:

1. 通过session1得到id=1的对象 product1

2. 在product1原来价格的基础上增加1000

3. 更新product1之前,通过session2得到id=1的对象product2

4. 在product2原来价格的基础上增加1000

5. 更新product1

6. 更新product2

 

2、乐观锁,在Product.hbm.xml,增加version字段,用于版本控制

<hibernate-mapping package="com.cex.pojo">
    <class name="Product" table="product_">
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <!--version元素必须紧挨着id后面  -->
        <version name="version" column="ver" type="int"></version>
        <property name="name" />
        <property name="price" />
 
        <many-to-one name="category" class="Category" column="cid" />
 
        <set name="users" table="user_product" lazy="false">
            <key column="pid" />
            <many-to-many column="uid" class="User" />
        </set>
 
    </class>
 
</hibernate-mapping>

 

3、Product增加version属性

public class Product {
    int id;
    String name;
    float price;
    Category category;
    int version;
}

 

十二、C3P0连接池配置

<property name="hbm2ddl.auto">update</property>

<property name="hibernate.connection.provider_class">
    org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">50000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- 当连接池耗尽并接到获得连接的请求,则新增加连接的数量 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- 是否验证,检查连接 -->
<property name="hibernate.c3p0.validate">false</property>


<property name="hibernate.cache.use_second_level_cache">true</property>

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!