Hibernate

xiaoxiao2021-02-28  81

对象的状态: 临时状态: 与数据库没有对应,跟Session没有关联。 一般是新new出的对象。 持久化状态: 对象在Session的管理之中,最终会有对应的数据库记录 特点: 1,有OID 2,对对象修改会同步到数据库 游离状态: 数据库中有对应记录,但对象不在Session管理之中。 修改此状态时,数据库不会有改变。 删除状态: 执行了delete()后的对象 ===================================================== 一、操作实体对象的 saver() saverOrUpdate() update() delete() 二、操作缓存的 clear() evict() flush() 三、查询实体对象的 get() load() createQuery() createCriteria() 加载方式 返回值 如果数据不存在 ----------------------------------------------------------------------- get() 立即加载 真实对象或者为null 返回null (饿汉模式) load() 延迟加载 返回代理对象 抛异常 (懒汉模式)

<?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内存溢出

转载请注明原文地址: https://www.6miu.com/read-83870.html

最新回复(0)