package joeho.blog.test;
import java.util.Date;
import java.util.List;
import joeho.blog.domain.HibernateUtils;
import joeho.blog.domain.User;
import junit.framework.TestCase;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
/**
*
* @author joeho
*
*/
public class SessionTest extends TestCase {
public void testSave(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
user = new User();
user.setName("ZHANGSAN");
user.setPassword("aaaa");
user.setRegistDate(new Date());
user.setExpireDate(new Date());
//prisistens
session.save(user);
user.setName("wangwu");
//可以显示的调用update方法,但是处于持久状态调用update没有什么意义
//session.update(user);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testSave2(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
user = new User();
user.setName("ZHANGSAN");
user.setPassword("aaaa");
user.setRegistDate(new Date());
user.setExpireDate(new Date());
//prisistens
session.save(user);
user.setName("wangwu");
//可以显示的调用update方法,但是处于持久状态调用update没有什么意义
//session.update(user);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
user.setName("wangmazi");
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//将detached的对象重新纳入session管理
session.update(user);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testGetUser(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
//prisistens
user=(User)session.get(User.class, 1);
System.out.println(user.getName());
user.setName("lisi");
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testGetUser2(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
//prisistens
user=(User)session.get(User.class, 3);
System.out.println(user.getName());
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testLoad(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
//prisistens
//支持延迟加载,此处user的值返回的是cglib的一个代理对象
user=(User)session.load(User.class, 1);
//只有在访问它的时候才会执行查询语句
System.out.println(user.getName());
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testLoad2(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
//prisistens
//支持延迟加载,此处user的值返回的是cglib的一个代理对象
//采用load查询不存在的语句,会抛出ClassNotFontException异常
user=(User)session.load(User.class, 5);
//只有在访问它的时候才会执行查询语句
System.out.println(user.getName());
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
/**
* 建议采用先加载再删除
*
*/
public void testDelete(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//transient
//prisistens
//支持延迟加载,此处user的值返回的是cglib的一个代理对象
//采用load查询不存在的语句,会抛出ClassNotFontException异常
user=(User)session.load(User.class, 2);
//只有在访问它的时候才会执行查询语句
System.out.println(user.getName());
session.delete(user);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testDelete2(){
Session session = null;
Transaction tx = null;
User user = null;
try{
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//手动构造detached对象
user = new User();
user.setId(1);
session.delete(user);
// hibernate可以改成只更新关联的数据,其他的更新为NULL
//一般的更新建议先load,或get再更新
// user.setName("wangmazi");
// session.update(user);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
//detached
}
public void testQuery(){
Session session=null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Query query = session.createQuery("from User");
query.setFirstResult(0);
query.setMaxResults(2);
List<User> list = query.list();
for(User user:list){
System.out.println("user name:"+user.getName()+"/npassword:"
+user.getPassword()+"/nregistdate:"+user.getRegistDate());
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
进一步通过测试Many2One来观察
package joeho.blog.test;
import joeho.blog.domain.Department;
import joeho.blog.domain.Employee;
import joeho.blog.domain.HibernateUtils;
import junit.framework.TestCase;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class Many2oneTest extends TestCase {
public void testSave1(){
Session session=null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Department department = new Department();
department.setName("开发部");
Employee emp1 = new Employee();
emp1.setName("张三");
emp1.setDepartment(department);
Employee emp2 = new Employee();
emp2.setDepartment(department);
emp2.setName("李四");
//当在多的一端没有配置casecade关系时,Hibernate在清理缓存时
//由于department对象不是持久对象,此处会报
//ObjectTransientException错误
session.save(emp1);
session.save(emp2);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
public void testSave2(){
Session session=null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Department department = new Department();
department.setName("开发部");
session.save(department);
Employee emp1 = new Employee();
emp1.setName("张三");
emp1.setDepartment(department);
Employee emp2 = new Employee();
emp2.setDepartment(department);
emp2.setName("李四");
//当在多的一端没有配置casecade关系时,Hibernate在清理缓存时
//由于department对象通过session.save(),是持久对象,此处不会报
//ObjectTransientException错误
session.save(emp1);
session.save(emp2);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
public void testSave3(){
Session session=null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Department department = new Department();
department.setName("测试部");
Employee emp1 = new Employee();
emp1.setName("张三");
emp1.setDepartment(department);
Employee emp2 = new Employee();
emp2.setDepartment(department);
emp2.setName("李四");
//当在多的一端有配置casecade关系时,Hibernate在清理缓存时
//由于department对象是持久对象,此处不会报
//ObjectTransientException错误
session.save(emp1);
session.save(emp2);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
public void testLoad(){
Session session=null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Employee emp = (Employee)session.load(Employee.class, 3);
System.out.println("department id="+emp.getDepartment().getName());
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}