hibernate session method

import static org.junit.Assert.*;

import java.io.FileInputStream;
import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class App {
    private SessionFactory sessionFactory = new Configuration()
                                            .configure()
                                            .addClass(User.class)
                                            .buildSessionFactory();

    @Test
    public void testSave() throws Exception{
        //save 把临时状态转变为持久状态(交给session管理)
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------

            User user = new User();//临时状态:数据库中没有对应的记录,跟session没有联系
            user.setName("test");

            session.save(user);//持久状态:在session的管理中最终数据库中会有对应的记录
//            session.save(user);//save是立即执行(如果主键是由自己指定的那也是在flush()中执行),delete和update都是默认在flush()执行
//            session.save(user);//同一个对象执行多次保存,只会保存一个到session集合,session管理的是同一个对象
//            session.save(user);

            user.setName("贱贱");//持久状态:会自动更新数据库中的内容

        //------------------------
            tx.commit();//默认调用flush()并执行所有的SQL语句
            session.close();//关闭session
            System.out.println(user);//session关闭之后变为游离状态,数据库中有记录,和session没有联系
            user.setName("小贱aaaa");//游离状态修改对象数据库不会更新
    }

    //把游离状态转变为持久状态
    //在更新时对象不存在会报错
    @Test
    public void testUpadet() throws Exception {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------
        User user = (User) session.get(User.class, 1);
        System.out.println(user);//持久化状态
        user.setName("小san");
//        session.flush();//立即执行,更新到数据库
        System.out.println("----------------");

//        session.clear();//清除session中所有的对象,user变为游离状态
//        session.evict(user);//清除session中user,user变为游离状态

//        session.update(user);//commit()执行游离状态转变为持久状态
        System.out.println("----------------");
        //--------------------
        tx.commit();
        session.close();
    }

    @Test
    public void testSaveOrUpdate() throws Exception {
        //把临时游离状态转变为持久状态
        //在更新时对象不存在会报错
        //本方法是根据id来判断对象是什么状态,如果id是原始值(临时状态)就insert,如果不是原始值(游离状态)就update,
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------
        User user = new User();//id原始值
//        user.setId(1);//设置了Id,执行update语句,如果数据库中没有就报错
        user.setName("张三");
        session.saveOrUpdate(user);
        //--------------------
        tx.commit();
        session.close();
    }

    @Test
    public void testDelete() throws Exception {
        //把持久化和游离状态转化为删除状态
        //如果删除的对象不存在抛异常
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------
//        User user = (User) session.get(User.class, 15);
//        session.delete(user);//删除持久化对象

        User user = new User();
        user.setId(16);//模拟游离对象
        session.delete(user);//删除游离对象
        //--------------------
        tx.commit();
        session.close();
    }

    @Test
    public void testGet(){
        //获取对象,持久化状态
        //如果对象不存在,返回null
        //马上执行SQL语句
        //返回的是真实对象
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------

        User user = (User) session.get(User.class, 1);
        System.out.println("---------------------");

        //------------------------
        tx.commit();
        session.close();
    }

    @Test
    public void testLoad() throws Exception {
        //获取数据,是持久化状态
        //延时加载,不立即执行SQL语句,而是在使用到除了(User.class, id)才执行SQL语句,用到数据库的数据才加载
        //返回的是代理对象
        //延时加载的实体类不能是final,否则不能生成子类代理
        //如果数据不存在就跑异常objectNotFoundException
        //让延时加载失效的方式:让实体类写成final,或者在**.hbm.xml中配置<class... lazy="false">
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------
        User user = (User) session.load(User.class, 1);//返回的是代理对象
        System.out.println(user.getId());
        System.out.println(user.getClass());

//        System.out.println(user.getName());//立即执行SQL语句
        //--------------------
        tx.commit();
        session.close();
    }

    @Test
    public void testBatchSave() throws Exception {
        //操作大量数据要防止session中对象过多而内存溢出
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        //------------------------
        for (int i = 0 ;i<1000 ; ++i){
            User user = new User();
            user.setName("大数据");
            session.save(user);
            if(i%10 == 0){
                session.flush();//先提交
                session.clear();//在清空
            }
        }

        //--------------------
        tx.commit();
        session.close();
    }

}
时间: 2024-10-24 13:01:54

hibernate session method的相关文章

hibernate session.get(class,serialid) 方法为空值的原因?

package hibernate.test; import hibernate.test.pojo.Person; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; impo

Hibernate session FlushMode

Hibernate session FlushMode有五种属性: 1.NEVEL:已经废弃了,被MANUAL取代了 2 MANUAL: 如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在增加.删除或修改操作过程中会出现如下错误 org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-

Hibernate Session 获取connection

Hibernate Session 获取connection 由于最近一个项目要用到一条辅助的SQL ,hibernate里面的SQLQuery API 总的SQL语句不能包含 : 冒号, 固放弃Hibernate, 直接使用JDBC. Hibernate3.3.2版本中getSession().connection()已被弃用,替代方法 SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection() 原有方法 get

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open con

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection org.springframework.orm.hibernate3.Hiberna

hibernate session问题大总结

openSessionInView的作用! OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的.由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad

Hibernage错误:Could not open Hibernate Session for transaction

今天在做SSH框架整合的时候碰到的这个问题,在测试service层的时候程序正常运行,但是添加Struts,在action层测试的时候提示了如下问题:Could not open Hibernate Session for transaction.大概意思就是数据库连接超时. 解决方法如下: 在spring的配置文件中添加如下配置 给sessionFactory的bean添加如下配置 <bean id="sessionFactory" class="org.spring

hibernate session.save()和session.persist()的区别

save()需要返回一个Serialzable的实现类,因此执行这个方法时会马上插入到数据库 而persist()不会立即插入到数据库. "当我们封装一个长会话流程的时候,persist()方法就显得尤为重要了!" 记录下来,防止自己再一次忘记 hibernate session.save()和session.persist()的区别,码迷,mamicode.com

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not

遇到这个问题之前,我去百度和谷歌去搜索了一下,发现各种说法,但是针对我的项目而言,也就是公司的项目而言,这个问题的根源并非是网上所说的那样. 最后是通过自己的想法做测试得到了解决. 1.首先说说我的配置吧!我的配置是通过spring自带的注解来实现 声明式事物管理的.如果我们没去了解spring的声明式事物管理的话,或许我们是得不出什么结论的. 如果你配置过声明式事物管理,你就知道spring是怎么帮你管理的. 2.spring声明式事物管理是在service层管理的,关于到sessionFac

第二节 hibernate session基本方法介绍

Hibernate session 对象是和数据库建立连接的对象,session中包含了许多操作数据库的方法,下面一一描述. 1 保存对象到数据库 session.save(); 按照第一节的配置,主键的生成策略为native(数据库自动生成主键),由于数据库使用的是mysql 5,所以是自增的主键生成方式.保存对象时并不需要设置id属性. @Test public void testSave() { try { User user = new User(); user.setBirthday(