你的位置:首页 > Java教程

[Java教程]hibernate(五)核心开发接口


一、Configuration

1、AnnotationConfiguration

2、进行配置信息的管理

3、configure()方法通过传入一个配置文件来使用例:new Configutayion.configure("myhibernateconfig.

 

二、SessionFactory

1、维护着数据库的连接池,当它产生一个session的时候就是从数据库连接池中捡出一个连接交给这个session。

2、getCurrentSession():如果当前上下文环境已经有一个session了就直接获取这个sesssion如果没有则创建一个session,(在session提交前即执行session.getTransaction().commit()之前拿到的是同一个session,而当session提交后session会关闭,再拿到就是新的session)。事务提交自动close()

4、上下文:通过在配置文件中指定hibernate.current_session_context_class属性

有四个值:jta | thread | managed | custom.Class

jta(java transaction api):java中用来管理事务的API(分布式数据库事务管理)

如果值为thread当执行getCurrentSession()时就会从当前线程找session,如果没有找到session则创建session

3、openSession():永远会创建一个新的session。需要close()。

(注:先openSession()获取一个session1,然后getCurrentSession()获取一个session2,这两个session不会==。因为session1标记为需要关闭而session2标记不可关闭,两个session的实现类不同)

 

三、对象三种状态

Transient(临时状态):是刚刚new出来。内存中一个对象,没id,缓存中也没有(session缓存)

Persistent(持久化状态):执行sava()等其他方法之后会转成Persistent状态,该状态有id。内存中有,缓存中有,数据库中有,有id。

Detached(脱离管理状态):close()等其他方法之后会转成该状态。内存有,缓存没有(脱离管理了),数据库有,id有

例:

Teacher t = new Teacher();// t:Transient状态t.setName("test1");// t:Transient状态t.setTitle("title1");// t:Transient状态    Session session = sf.openSession();    session.beginTransaction();session.save(t);
System.out.println(t.getId());// t:Persistent状态session.getTransaction().commit();
System.out.println(t.getId());// t:Detached状态session.close();

 

2、三种状态的区别

(1)有没有id;

  如果没有id一定是Transient状态

(2)id在数据库中有没有;

(3)id在内存中有没有(session缓存);

 

四、Session

1、管理一个数据库的任务单元(session来帮我们管理,进行curd)

2、方法(CURD)

(1)delete

  执行delete()方法会转成Transisent状态(参考三状态图),只要有id号就可以删除

(2)load(Class arg0 , Serialirable arg1),第一个参数是类,第二个是主键

  例:Teacher t = (Teacher)session.load(Teacher.class , 1);

  注:

Teacher t = (Teacher)session.load(Teacher.class , 1);session.getTransaction().commint();System.out.println(t.getName());

这种写法会抛出LazyInitializationException:could not initialize proxy - no Session异常

原因是load返回代理对象,当执行load方法的时候并不会发出sql语句,而是等到执行取出t对象的属性的时候(比如执行getName()的时候)才执行。而例子中执行getName()的时候session事务已经提交了

  

(3)get(Class arg0  , Serialirable arg1),第一个参数是类,第二个参数是

  例:Teacher t = (Teacher)session.load(Teacher.class , 1);

  当执行get方法的时候会马上发出sql语句,然后从数据库中取出值装到对象t中。