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
- Hibernate(八)Session方法、事务隔离级别及懒加载
- Hibernate深入理解----03操作Session缓存方法(flush、refresh、clear,事务隔离级别)
- Hibernate深入理解----03操作Session缓存方法(flush、refresh、clear,事务隔离级别)
- Hibernate事务隔离级别及基本介绍
- Hibernate Session 事务隔离级别回顾 持久化对象的状态 Session核心方法
- Hibernate事务隔离级别
- Hibernate 事务隔离级别
- Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session
- 事务及事务隔离级别
- 事务及事务隔离级别
- Hibernate事务与并发问题处理(乐观锁与悲观锁)及事务隔离级别
- Hibernate 中的session 的flush、reflush 和clear 方法 ,及数据库的隔离级别
- Hibernate中事务隔离级别
- hibernate 事务和隔离级别
- SSH:Hibernate框架(Hibernate数据库事务与隔离级别)
- 数据库事务及隔离级别
- Java 事务及隔离级别
- Java 事务及隔离级别
- POJ3749
- C#中Invoke的用法(转)
- android下拉刷新(android.support.v4.widget.SwipeRefreshLayout)
- C++访问控制
- 择善JAVA学习String和StringBuffer
- Hibernate(八)Session方法、事务隔离级别及懒加载
- 函数
- POJ-3748 位操作
- 一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5
- 一个很好地List实现源码
- 用Fragment实现Tab页面切换效果初步总结
- 股票学习07K线解释
- ChinaVis2015 第一天会议
- 贪心初练