Hibernate3学习笔记(一)

来源:互联网 发布:白银公司大数据公司 编辑:程序博客网 时间:2024/05/22 17:44

将对象映射到数据库

//默认读取hibernate.cfg.xml文件Configuration cfg = new Configuration().configure();SchemaExport export = new SchemaExport(cfg);//是否将脚本打印到控制台是否输出脚本到数据库export.create(true,true);

Hibernate的几种状态
Hibernate的几种状态
把对象存入表中(持久化数据)

//读取配置文件Configuration cfg = new Configuration().configure();//建立SessionFactory   对应一个数据库SessionFactory factory = cfg.buildSessionFactory();//取得session (这个session需要关闭)Session session = null;try{    session = factory.openSession();    //开启事务    session.beginTransaction();    User user = new User();    user.setName("张三");    user.setPassword("123456");    //保存对象    session.save(user);    //提交事务    session.getTransaction().commit();}catch(Exception e){    e.printStackTrace();    //如果出问题就回滚事务    session.getTransaction().rollback();}finally{    //关闭session    if(null!=session){        if(session.isOpen()){            session.close();        }    }}

Hibernate中数据的几种状态

session = HibernateUtils.getSession();tx = sesion.beginTransaction();//此时进入Transient状态User user = new User();user.setName("张三");user.setPassword("123456");//Persistent状态//Persistent状态的对象,当属性发生改变的时候//hibernate在清理缓存(脏数据检查)的时候,会和数据库同步session.save(user);//改变对象属性user.set("李四");//提交事务tx.commit();//detached状态//数据库中存入的对象名字应该是李四//如果控制台打印SQL会发现打印了两条SQL语句,一条插入语句、一条更新语句。

Hibernate Session的get()方法

Session session = null;try{//HibernateUtils是自己写的一个Session工具类    session = HibernateUtils.getSession();    session.beginTransaction();    //该方法会在数据库里面根据这个id寻找该对象,找到就返回Object对象的实例,找不到返回null.    User user = (User) session.get(User.class,"123456");    //此时user对象处于Persistent状态    user.setName("王五");    //改变后提交事务Hibernate会执行更新数据库操作    session.getTransaction().commit();}catch(Exception e){    e.printStackTrace();    session.getTransaction().rollback();}finally{    HibernateUtils.closeSession(session);}

Load方法

//...省略之前代码    关键部分代码:User user = (User) session.load(User.class,"1234356");//id随便写的user.setName("王五");//此时并未访问数据库(不会打印SQL语句)System.out.println(user.getName());//此时才开始访问数据库//因为load支持lazy(延迟加载),默认是开启代理的//理解Hibernate里面的延迟加载:真正使用的时候再创建对象//主要是提高性能//主要采用代理实现,使用CGLIB库生成的session.getTransaction().commit();//补充:load查询一个不存在的数据会抛出ObjectNotFound异常

CRUD总结
get和load方法的差别
* get不支持lazy,load在默认情况下支持lazy
* get加载数据,如果不存在则返回null,而load抛出ObjectNotFound异常

Transeint
*没有被session管理
*在数据库中没有与之匹配的记录
Persistent
*纳入session管理
*在数据库中有与之匹配的记录
*当属性发生改变,在清理缓存的时(脏数据检查)会自动同步数据库
Detached
*没有被session管理
*在数据库中存在与之匹配的记录
Session 是一个持久化管理器


Hibernate的hql

Session session = null;try{    session = HibernateUtils.getSession();    session.beginTransaction();    //createQuery方法会返回一个Query对象    Query query = session.createQuery("from User");    //Query的list方法返回一个java.util.List对象    List userList = query.list();    for (Iterator iter = userList.iterator();iter.hasNext();){        User user = (User) iter.next();        System.out.println("id="+user.getId()+"name="user.getName());    }}catch(Exception e){    e.printStackTrace();}finally{}

hql分页查询

/*Query里面有如下方法:public Query setMaxResults(int maxResults);//得到最大结果集public Query setFirstResult(int firstResult);//从哪开始查,从0开始*/Session session = HibernateUtils.getSession();session.beginTransaction();Query query = session.createQuery("from User");//设置从第几条开始  (第一条是0)query.setFirstResult(1);//设置一页多少query.setMaxResult(2);List userList = query.list();    for (Iterator iter = userList.iterator();iter.hasNext();){        User user = (User) iter.next();        System.out.println("id="+user.getId()+"name="user.getName());

Hibernate基本映射

实体类—表,采用< class>标签映射
实体类属性(不包括集合、自定义类和数组)—表字段,采用< property>标签映射

如果实体类的名字或者实体类的属性的名字和数据库关键字重复将会出现问题
class标签中的table可以指定表名称
property标签中column属性可以指定列名

实体类的设计原则:
*实现无参构造方法
*提供一个标识
*建议不要使用final修饰实体类
*建议为实体类生成getter和setter方法
主键生成策略:
*identity
*sequence
*uuid
*native
*assigned
*foreign

原创粉丝点击