您的位置:首页 > 其它

Hibernate_操作对象_Session中的方法详解

2017-05-07 21:07 316 查看
对象的状态:

临时状态:
与数据库没有对应,跟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内存溢出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: