Hibernate-- (二)核心类和接口

来源:互联网 发布:win7摄像头打开软件 编辑:程序博客网 时间:2024/04/30 08:55

这一章简单说一下hibernate的核心类和几个重要的接口,因为我是菜鸟,还在学习中,所以有什么不对的地方,还希望指出来。

废话不多说,直接进入正题

1.Configuration类

Configuration类有什么作用那?

(1)负责管理hibernate的配置信息。

(2)读取hibernate.cfg.xml

(3)加载hibernate.cfg.xml配置文件中配置的驱动、URL、用户名、密码、连接池。

(4)管理   *. hbm.xml对象关系文件。

代码举例:

   Configuration cf = new Configuration().configure();

2.hibernate.cfg.xml文件

(1)该对象文件主要用于指定各个参数,是hibernate核心文件。

(2)默认放在src目录下,也可以放在别的目录下。

(3)指定连接数据库的驱动、用户名、密码、URL、连接池。

(4)指定对象关系映射文件的位置。

(5)也可使用hibernate.properties文件来替代该文件,不过一般使用hibernate.cfg.xml

3.对象关系映射文件( * . hbm . xml )

(1) 该文件主要作用是建立表和类的映射关系,是不可或缺的重要文件。

(2)一般放在其映射的类同一个目录下。

(3)命名方式一般是 类名 . hbm . xml

(4)示意图:

 

4.SessionFactory(会化工厂)接口

(1)缓存Sql语句和某些数据

(2)在应用程序初始化的时候创建,是一个重量级的类(会占用比较多的内存),一般使用单例模式保证一个应用中只需要一个SessionFactor实例。

(3)如果某个应用访问多个数据库,则需要创建多个会化工厂实例,一般是一个数据库一个会化工厂实例。

(4)通过SessionFactory接口可以获得Session(会话)实例,SessionFactory获取Session的两个方法为openSession()和getCurrentSession();

openSession是获得一个全新的Session,而getCurrentSession则是获得和当前线程绑定的Session,在同一线程中,获取的是同一个Session,这样可以利于事务的控制。

在使用getCurrentSession()时,需要在hibernate.cfg,xml文件中配置如下代码:

                        <property name="carrent_session_context_clss">thread</property>

SessionFactory启动的时候,Hibernate会根据配置创建相应的CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession()。在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession

这就是openSession()和getCurrentSession()的联系。

 

5.Session接口

(1)Session一个实例代表与数据库的一次操作(可以是CRUD的组合)。

(2)Session实例通过SessionFactory获取,所以用完之后需要关闭。

(3)Session是线程不同步的,所以它不安全,因此要保证在同一线程中使用,可以用getCurrentSession()。

(4)Session可以看做是持久化管理器,它是与持久化操作相关的接口。

Session几个重要的方法:

1.保存一个对象:

public Serializable save(String entityName,                         Object object)                  throws HibernateException

2.删除一个对象:

public void delete(String entityName,                   Object object)            throws HibernateException

 

3.查询一个对象:

 

public Object get(String entityName,                  Serializable id,                  LockMode lockMode)           throws HibernateException

 

 

public Object load(String entityName,                   Serializable id,                   LockMode lockMode)            throws HibernateException

4.修改一个对象:

public void update(String entityName,                   Object object)            throws HibernateException

6.get()和load()区别

上面提到Session中查询对象的方法有两个,那他们之间有什么区别那?

1get()方法直接返回实体类,如果查不到数据则返回null。而load()返回一个实体代理对象(当前这个对象可以自动转化为实体对象),但当代理对象被调用时,如果没有数据不存在,就会抛出个org.hibernate.ObjectNotFoundException异常。

2.load()方法先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是常说的load()方法在默认情况下支持延迟加载。

3. get()先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)。总之,如果确定DB中有这个对象就用load(),不确定就用get()(这样效率高)。

 

 

好了,这一章节就介绍这些,欢迎大家点评。

 

 

 

 

0 0
原创粉丝点击