Hibernate(八)Session方法、事务隔离级别及懒加载

来源:互联网 发布:php redis 队列算法 编辑:程序博客网 时间:2024/06/05 05:37


1,操作实体对象的Session方法
save()
update()
saveOrUpdate()
delete()

2,操作缓存的Session方法
clear() 清空Session缓存,不会执行sql语句。
evict()
flush() 马上执行sql语句,不会清楚Session缓存。


3,查询实体对象的Session方法
get()
load()
createQuery()

createCriteria()

package test.hibernate.session;public class User {private Integer id;private String name;private byte[] b=new byte[1024 * 1024 * 5];public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="test.hibernate.session"><class name="User" table="session_user"><!-- id元素用于映射主键。 子元素generator是用于指定主键生成策略的。 --><id name="id" type="integer" column="id"><generator class="native"></generator></id><property name="name" /></class></hibernate-mapping>


主配置文件

数据库的事务隔离级别可在主配置文件里改

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory name="foo"><!-- 配置数据库信息 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://localhost:3306/hibernate_2015</property><!-- 可简写为<property name="connection.url">jdbc:mysql:///hibernate_2015</property> --><property name="connection.username">root</property><property name="connection.password">686175</property><!-- 显示生成的sql语句,不写的话默认是false --><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><!-- 设置事务隔离级别 -->        <property name="connection.isolation">2</property>        <!-- <mapping resource="test/hibernate/domain/User.hbm.xml" /> <mapping resource="test/hibernate/hbmProperty/User.hbm.xml" /> --></session-factory></hibernate-configuration>

package test.hibernate.session;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class App {private static SessionFactory sessionFactory = new Configuration()//.configure()//.addClass(User.class)// 添加Hibernate实体类(加载对应的映射文件).buildSessionFactory();@Testpublic void testSave() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------// 构建对象User user = new User();// 临时状态// user.setId(UUID.randomUUID().toString());//id设为String类型user.setName("张三");// 保存session.save(user);// 变成持久化状态System.out.println("=======xxxxxxxxxxxxxx========");// --------------------------------------------session.getTransaction().commit();session.close();// 数据库里面有,session里没有,为游离状态user.setName("李四");System.out.println(user.getName());}// update():把游离状态变为持久化状态@Testpublic void testUpdate() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = (User) session.get(User.class, 2);// user.setId(1);// user.setName("new name");// session.flush();// 把user刷出到数据库//// session.clear();// 变为游离状态,清除session中所有的对象session.evict(user);// 清除一个指定的对象user.setName("TestName");session.update(user);System.out.println("===================");// --------------------------------------------session.getTransaction().commit();session.close();}// saveOrUpdate():把临时或游离状态转为持久化状态/* * 本方法根据id判断对象是什么状态。  * 如果id为原始值(对象是null,原始类型数字是0)就是临时状态;  * 如果不是原始值就是游离状态 */@Testpublic void testSaveOrUpdate() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = new User();user.setId(1);user.setName("testSaveOrUpdate");session.saveOrUpdate(user);// --------------------------------------------session.getTransaction().commit();session.close();}// delete():把持久化或游离状态转为删除状态// 如果删除的对象不存在,会抛出异常@Testpublic void testDelete() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = (User) session.get(User.class, 8);session.delete(user);session.flush();System.out.println("==========================");// --------------------------------------------session.getTransaction().commit();session.close();}// get():获取数据,是持久化状态// 如果查询的对象不存在会抛出异常@Testpublic void testGet() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = (User) session.get(User.class, 8);System.out.println(user.getId());System.out.println(user.getName());// --------------------------------------------session.getTransaction().commit();session.close();}// load():懒加载,获取数据,是持久化状态。延迟加载,用的时候才加载/* * load()后返回的是一个代理对象,要求类(这里是User类)不 * 能是final的, 否则不能生存子 类代理,就不能使用懒加载功能。 */@Testpublic void testLoad() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = (User) session.load(User.class, 7);System.out.println(user.getId());System.out.println(user.getName());// --------------------------------------------session.getTransaction().commit();session.close();}@Testpublic void testBatchSave() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------for (int i = 0; i < 50; i++) {User user = new User();user.setId(i);user.setName("ss0" + i);session.save(user);System.out.println("=====================");if (i % 10 == 0) {session.flush();// 先刷出session.clear();// 再清空}}// --------------------------------------------session.getTransaction().commit();session.close();}@Testpublic void testRefresh() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------User user = (User) session.get(User.class, 1);System.out.println(user.getName());// session.clear();session.refresh(user);// 设置断点,debug as// user=(User) session.get(User.class, 1);// 此时修改数据库的第一条记录的name值并打印出来,与176行的不一样System.out.println(user.getName());// --------------------------------------------session.getTransaction().commit();session.close();}}

lazy属性:懒加载,默认为true
 true 懒加载,在第一次使用时加载
 false 立即加载,在获取本对象时就加载这个集合的所有元素
 extra 增强的懒加载策略

在Department.hbm.xml里配置lazy属性

<set name="employees" inverse="false" cascade="save-update" lazy="extra"><key column="departmentId"></key><one-to-many class="Employee" /></set>

@Testpublic void testLazy() throws Exception {Session session = sessionFactory.openSession();session.beginTransaction();// --------------------------------------------Department department=(Department) session.get(Department.class, 1);System.out.println(department.getName());//可以使用增强的懒加载extra,因为只需要数字System.out.println(department.getEmployees().size());/* * 这里要所有员工信息,才需要真正地加载。直接放在session关闭后执行 * 会抛出LazyInitializationException,原因是真正去获取数据时, * session已经关闭解决异常的方法除了关掉懒加载,还可以先初始化 * Hibernate.initialize(department.getEmployees()) */System.out.println(department.getEmployees());// --------------------------------------------session.getTransaction().commit();session.close();}

lazy=true


lazy=false


lazy=extra


让懒加载失效的方式:

1、把实体写成final的

2、在hbm.xml中写<class ... lazy="false">

保存


更新


事务隔离级别

调试testRefresh



按F6,debug over往下执行


待续
0 0
原创粉丝点击