hibernate中session,HQL,持久化,一对多,多对一

package com.hanqi.test;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.hanqi.entity.Course;
import com.hanqi.entity.Teacher;
import com.hanqi.entity.User;

public class Test01 {
private SessionFactory sf=null;
private Session se=null;
private Transaction ts;

//在测试用例执行之前自动执行的方法
//一般用来初始化的公用对象
//前置方法
@Before
public void init()
{
            //1获取配置文件
            Configuration cfg=new Configuration().configure();

            //2注册配置
            ServiceRegistry sr=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();

            //3获取SessionFactory(相当于JDBC)
             sf =cfg.buildSessionFactory(sr);

            System.out.println(sf);

            //4产生Session
             se=sf.openSession();

            //5启动事务
             ts=se.beginTransaction();
}

//后置方法
//一般用来释放资源
@After
public void destroy()
{
            //7提交事务

            ts.commit();
            //8释放资源
            se.close();
            sf.close();

}

//测试Hibernate连接数据库

@Test
public void test()
{
    //1获取配置文件
    Configuration cfg=new Configuration().configure();

    //2注册配置
    ServiceRegistry sr=new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();

    //3获取SessionFactory(相当于JDBC)
    SessionFactory sf =cfg.buildSessionFactory(sr);

    System.out.println(sf);

    //4产生Session
    Session se=sf.openSession();

    //5启动事务
     ts=se.beginTransaction();

    //6操作事务
    //添加数据
     //实例化的新对象处于临时状态
    User u1=new User();
    u1.setBirthday(new Date());
    u1.setMoney(2000);
    u1.setPassword("123456");
    u1.setUserName("测试一");

    //保存数据
    //通过save方法把对象从临时状态转成持久化状态
    se.save(u1);
    System.out.println(u1);

}
//测试查询方法
@Test
public void test1()
{
    //查询数据
    //提供两个参数:
    //1需要返回哪一个持久化类的实例
    //2实例的标识(数据的主键值)
    //通过Session的get方法获得的对象处于持久化状态
    User u2=(User)se.get(User.class,3);

    u2.setUserName("修改的");

    System.out.println(u2);

    //删除
    se.delete(u2);//使持久化对象进入删除状态
}
@Test
public void test2()
{
    User u1=(User)se.get(User.class, 4);

    System.out.println(u1);

    User u2=(User)se.get(User.class, 4);//立即加载数据
    System.out.println(u2);
}
@Test
public void test3()
{
    User u1=(User)se.load(User.class, 4);//延时加载  懒加载
    System.out.println("dsad");
    System.out.println(u1);//当使用时才加载
}

//测试游离状态

@Test
public void test4()
{
    //得到持久化状态的对象
    User u1=(User)se.get(User.class,4);
    System.out.println("u1="+u1);
    //关闭session
    se.close();

    //使u1进入游离状态
    u1.setUserName("测试游离");
    //把OID置成null
    u1.setUserID(null);

    //重新创建session
    se=sf.openSession();
    //重新开启事务
    ts=se.beginTransaction();

    se.saveOrUpdate(u1);
    System.out.println(u1);
}
//测试HQL
@Test
public void test5()
{
    //使用HQL
    //1创建Query对象
    Query qu=se.createQuery("from User where userID >? and "
            + "userName like ‘测试%‘ order by userID");

    //设置占位符
    qu.setInteger(0, 10);

    //执行查询
    List<User> lu=qu.list();

    //方法链调用
    //lu=se.createQuery("from User where userID >?").setInteger(0, 10).list();

    for(User e:lu)
    {
        System.out.println(e);
    }
}
//测试分页
@Test
public void test6()
{
    //设置开始行号:页码=2
    //(页码-1)*每页行数
    List<User> lu=se.createQuery("from User order by userID")
            .setMaxResults(5)
            .setFirstResult(5)
            .list();

    for(User e:lu)
    {
        System.out.println(e);
    }

}
//分组查询
@Test
public void test7()
{
    List<Object>lo=se.createQuery("select userName from User group by userName").list();

    for(Object o:lo)
    {
    System.out.println(o);
    }

}
//测试投影查询
@Test
public void test8()
{
    List<Object[]>lo=se.createQuery("select userID,userName from User").list();

    for(Object[] o:lo)
    {
        System.out.println(o[0]+" "+o[1]);
    }
    System.out.println("dasdasadfa");
    //返回持久化对象的集合
    List<User> lu=se.createQuery("select new User(userID,userName) from User").list();

    for(User u:lu)
    {
        System.out.println(u);

    }

}
//测试多对一
@Test
public void test10()
{
    Course cs=(Course)se.get(Course.class,"9-888");
            System.out.println(cs);
}
//测试一对多
@Test
public void test11()
{
    Teacher  tc=(Teacher)se.get(Teacher.class,"831");
    System.out.println(tc);
}

}

时间: 2024-10-15 14:29:03

hibernate中session,HQL,持久化,一对多,多对一的相关文章

hibernate中执行hql语句创建session需要的HibernateUtil类

import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory sessionFactory = null; static { try { Confi

Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

hibernate中session

hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果只是单独的hibernate程序的话. 获得session之后,打开事务,操作数据库,提交(回滚事务),关闭session.就这样完成了操作DB ? Hibernate中session的使用: 在Hibernate中session主要是用来操作数据库? Hibernate在操作数据库前需要得到Ses

[转]Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

HttpSession与Hibernate中Session的区别

HttpSession与Hibernate中Session的区别 一.javax.servlet.http.HttpSession是一个抽象接口 它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一表示.注意,是容器(Tomcat,Resin)自动创建的. 用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限.例如在购物车程序里,存放用户买的商品. 销毁:一定时间(跟容器有关)内,用户无任何动作,session

Hibernate 中update hql语句

今天在MySQL中用hibernate测试update语句发现以下问题: update语句竟然不去作用: 表机构如下: create table student(sid int primary key , sname varchar(45) not null, ssex char(2) not null,sdept varchar(10) not null,sage int ,saddress varchar(45) ); update语句如下: String[] params = new St

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

Hibernate中Session与本地线程绑定

------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session 对象是单线程对象,只能自己使用,不能共用 将 Session 与本地线程绑定,保证 Session 对象绝对是一个单线程对象 3.Hibernate 帮助我们实现了 Session 与本地线程绑定(底层是 ThreadLocal) 4.获取与本地线程绑定的 Session (1)在 Hiberna

hibernate中session线程安全的实现

在hibernate中session是使用ThreadLocal实现线程安全的. ThreadLocal并不是一个Thread,而是一个线程副本,ThreadLocal为每个使用该变量的线程提供一个变量副本,线程修改自己的变量副本不会影响其他线程的变量副本 ThreadLocal有四个方法: set():设置当前线程的局部变量的值 get():获取当前线程的局部变量的值 remove():将当前线程局部变量的值删除,此方法不必显示的调用,因为局部变量自有垃圾回收器去清理 initialValue

框架 day32 Hibernate,一级缓存,关联关系映射(一对多,多对多)

一级缓存 概念 *在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java集合构成了Session缓存. 只要 Session 实例没有结束生命周期, 存放在它缓存中的对象也不会结束生命周期 *当session的save()方法持久化一个对象时,该对象被载入缓存, 以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中. 当试图get(). load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库.没有再查询数据库 *Session 能够在