<?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="cn.itcast.h_session_method"> <!-- lazy属性:默认为true,默认可以懒加载。 --> <class name="User" table="user" lazy="true"> <id name="id" type="integer" column="id"> <generator class="native" /> </id> <property name="name" type="string" column="name" /> </class> </hibernate-mapping> package cn.itcast.h_session_method; /** * 实体 * * @author 风清杨 * @version V1.0 */ public class User { private Integer id;// 编号 private String name;// 姓名 private byte[] bys = new byte[1024 * 1024 * 10]; 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; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } } package cn.itcast.h_session_method; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.Test; /** * 操作类 * * @author 风清杨 * @version V1.0 */ public class App { private static SessionFactory sessionFactory;// 创建会话工厂 // 初始化配置 static { // 会话工厂生成 sessionFactory = new Configuration()// .configure()// .addClass(User.class)// 添加hibernate实体类(加载对应的映射文件) .buildSessionFactory(); } // save():把临时状态变成持久化状态(交给session管理) // 会生成:insert into ... @Test public void testSave() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; User user = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ user = new User();// 临时状态 user.setName("test"); session.save(user);// 变为了持久化状态 // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } user.setName("李四");// 游离状态 System.out.println(user.getName());// 游离状态 } // update():把游离状态变为持久化状态 // 会生成:update ... // 在更新时,对象不存在就报错 @Test public void testUpdate() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.get(User.class, 1); System.out.println(user.getName());// 持久化状态 // session.clear();// 清除Session中所有的对象 游离状态 session.evict(user);// 清除Session中一个指定的对象 user.setName("newname"); session.update(user);// 持久化状态 // session.flush();// 刷出到数据库 // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // saverOrupdate():把临时或游离状态转为持久化状态 // 会生成:insert into 或者是 update // 在更新时,对象不存在就报错 // 本方法是根据id判断对象是什么状态,如果id为原始值(对象是null,原始类型数字是0)就是临时状态,如果不是原始值就是游离状态。 @Test public void testSaveOrupdate() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = new User(); user.setId(3);// 自已生成一个游离状态对象 user.setName("newname3"); session.saveOrUpdate(user); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // delete():把持久化状态转为删除状态 // 会生成:delete ... // 如果删除的对象不存在,就会抛异常 @Test public void testDelete() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ // User user = (User) session.get(User.class, 2);// 持久化 User user = new User();// 游离状态 user.setId(130); session.delete(user); session.flush(); System.out.println("---"); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // get():获取数据,是持久化状态 // 会生成:select ... where id=? // 会马上执行SQL语句 // 如果数据不存在,就会返回null @Test public void testGet() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.get(User.class, 2);// 持久化状态 System.out.println(user); System.out.println("-----"); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // load():获取数据,是持久化状态 // 会生成:select ... where id=? // load()后返回的是一个代理对象,要求类不能是final的,否则不能生成子类代理,就不能使用懒加载功能了 // 让懒加载失效方式:一、把实体类写成final的;二、在hbm.xml中写<class ... lazy="false">; // 不会会马上执行SQL语句,而是在第一次使用非id或class属性时执行SQL。 // 如果数据不存在,就抛出异常 @Test public void testLoad() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ User user = (User) session.load(User.class, 5);// 持久化状态 System.out.println(user.getClass()); System.out.println("-----"); System.out.println(user.getName()); // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } // 操作大量数据,要防止Session对象过多而内存溢出 @Test public void testBatchSave() throws Exception { Session session = sessionFactory.openSession();// 打开Session Transaction tx = null; try { tx = session.beginTransaction();// 开始事务 // ------------------------------------------------------------ for (int x = 0; x < 160; x++) { User user = new User(); user.setName("测试"); session.save(user); if (x % 10 == 0) { session.flush();// 先刷出 session.clear();// 再清空 } } // ------------------------------------------------------------ tx.commit();// 提交事务 } catch (Exception e) { tx.rollback();// 回滚事务 throw e; } finally { session.close();// 释放资源 } } }
测试JVM内存溢出
