一、如何支持事务
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>
来源:CSDN
作者:chenenxiong
链接:https://blog.csdn.net/chenenxiong/article/details/103843341