Hibernate延迟加载:
在session关闭之前先获取需要查询的数据,可以使用工具方法Hibernate.isInitialized()判断对象是否被加载,如果没有被加载则可以使用Hibernate.initialize()方法加载对象。
使用拦截器或过滤器延长Session的生命周期直到视图获得数据。Spring整合Hibernate提供的OpenSessionInViewFilter和OpenSessionInViewInterceptor就是这种做法。
在web.xml中配置
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Hibernate和session绑定:
在hibernate核心配置文件中配置
<-- session绑定 -->
<property name="hibernate.current_session_context_class">thread</property>
获取和线程绑定的session:
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
static Configuration cfg = null;
static SessionFactory sessionFactory = null;
//静态代码块实现
static {
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//提供返回sessionFactory对象的方法
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
import cn.itcast.entity.UserTest;
import cn.itcast.utils.HibernateUtils;
public class HibernateDemo {
public void testSession() {
SessionFactory sessionFactory = null;
Session session = null;
sessionFactory = HibernateUtils.getSessionFactory();
//获取与线程绑定session
session = sessionFactory.getCurrentSession();
//session对象
session = sessionFactory.openSession();
}
}
在hibernate.cfg.xml配置事务隔离级别:
<--
8 - Serializable 串行化
4 - Repeatable Read 可重复读
2 - Read Commited 可读已提交
1 - Read Uncommited 可读未提交
-->
<property name="hibernate.connection.isolation">4</property>
开启事务:
Transaction tx = session.beginTransaction();