持久化类
持久化类只是一个普通的类,并没有特殊的功能,也就是说它不依赖与任何对象,又被成为POJO类。Hibernate持久化类编写遵循一定的规范,创建时需要注意一下几点:
(1)声明一个默认的无参构造方法;
(2)类的声明都是非final类型的;
(3)拥有一个标识属性;
(4)为属性声明访问其,即get和set方法。
对于持久化类和数据库表之间的映射,可以使用xml或者annotation的方式进行配置。
1、SessionFactory的创建过程
Hibernate通过Configuration类加载Hibernate配置信息,主要通过Configuration对象的configure()方法来实现。默认情况下,Hibernate加载classpath目录下的”hibernate.cfg.xml“文件。
Configuration cfg=new Configuration.configure();
加载完毕后通过Configuration对象的buildSessionFactory()方法创建SessionFactory对象。
SessionFactory sessionFactory=cfg.buildSessionFactory();
持久化对象
Hibernate框架对JDBC作了轻量级的封装,使用Hibernate对数据进行操作时,不必再写繁琐的JDBC代码,而是完全以面向对象的思维方式,通过Session接口对数据进行增、删、改、查操作。但要注意Hibernate对事务的控制。
图1:Hibernate持久化对象流程
1、增加数据
使用Session接口的save()方法。
语法:public Serializable save(Object obj) throws HibernateException;
例子:sessioin.save(user);
实体状态解释:在执行save()方法之前,首先创建User对象user,并对其属性赋值。此时user处于Transient(瞬时)状态,并没有在Session的管理之中;当提交事务后,user处于Persistent(持久)状态,已经在Session的管理之中,且数据库中存在与之匹配的数据;当Session关闭后,user脱离Session的管理,处于Detached(托管)状态。
2、查询数据
使用Session接口的get()和load()方法。
两者区别:get()返回的实际对象;load()返回对象的代理,只有在被调用的时候,Hibernate才会发出SQL语句去 查询对象。
语法:public Object get(Class entityClass,Serializable id) throws HibernateException;
public Object load(Class entityClass,Serializable id) throws HibernateException;
例子:User user=(User)session.get(User.class,new Integer(1));
User user=(User)session.load(User.class,new Integer(1));
解释:当调用get()方法时,Hibernate就会发出SQL语句进行查询;当调用load()方法时,Hibernate并不会立刻发出SQL语句进行查询,只有在引用对象时才会发出SQL语句。
3、删除数据
使用Session接口的delete()方法
语法:public void delete(Object obj) throws HibernateException;
例子:User user=(User)session.load(User.class,new Integer(1));
sessioin.delete(user);
解释:在删除操作之前,程序首先加载User对象user,使其处于Persistent(持久)对象,然后再进行删除操作。所以,运行程序,Hibernate将发出两条语句。
4、修改数据
分为两种情况:
(1)自动更新、当对象处于Persistent(持久)状态时,对于它所发出任何更新操作,Hibernate在更新缓存时都将对其进行自动更新。
自动更新的方法与删除数据相似,在操作之前都要先加载数据,因为要修改的数据并没有处于Session管理之内。当通过load()、get()加载数据后,持久化对象遍处于Session的管理之内,即处于持久状态,在进行数据修改时,Hibernate将自动对数据进行更新操作。
例子:User user=(User)session.load(User.class,new Integer(1));
user.setName("Jack");
//下面即可以提交事务
解释:对于Persistent(持久)状态的对象,Hibernate在更新缓存时将对数据进行对比,当对象发生变化时,Hibernate将更新数据。
(2)手动更新
使用Session接口的update()或者saveOrUpdate();
语法:public void update(Object obj) throws HibernateException;
例子:User user=new User();
user.set...
session.update(user);
解释:由于程序手动创建Detached状态的User对象,当更新数据时,对于持久化对象中没有值的属性也将会同步到数据库中。对没有设置属性值的,数据表将会设置为空,所以应该谨慎!