Hibernate实战_笔记13(切换回Hibernate接口)

来源:互联网 发布:mysql安装失败 编辑:程序博客网 时间:2024/06/05 07:12

切换到Hibernate接口

      决定用Hibernate作为JPA持久化的提供程序有几个原因:首先,Hibernate是一个很好的JPA实现,它提供许多不影响代码的选项。例如可以在JPA配置中启用Hibernate的二级数据高速缓存,并透明地提升应用的性能和可量测性,而不需要动任何代码。
其次,必要时可以使用原生的Hibernate映射或API。但是这里我们要说明,需要的时候,你如何能够可以在JPA应用中使用Hibernate API。显示,把Hibernate API导入代码中使得把代码移植到一个不同的JPA提供程序变得更困难了。因此,正确地隔离这部分代码变得尤其重要,或者至少用文档说明你为什么和何时使用过一个原生的Hibernate特性。
      你可以从它们对应的JPA接口退回到Hibernate API,获得Configuration、SessionFactory,必要时甚至是Session。

注意,下载JBoss Community(找了好久的啊)

下载地址:http://sourceforge.net/projects/jboss/?source=directory
package cn.jbit.ejbjpa.test;import java.sql.Connection;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.ejb.Ejb3Configuration;import org.hibernate.ejb.HibernateEntityManager;import org.hibernate.ejb.HibernateEntityManagerFactory;public class Test2 {public static void main(String[] args) {Ejb3Configuration cfg = new Ejb3Configuration();EntityManagerFactory emf = cfg.buildEntityManagerFactory();// 使用Hibernate原生ConfigurationConfiguration hcfg = cfg.getHibernateConfiguration();HibernateEntityManagerFactory hibemf = (HibernateEntityManagerFactory) emf;// 使用Hibernate原生SessionFactorySessionFactory sessionFactory = hibemf.getSessionFactory();EntityManager em = emf.createEntityManager();// 使用Hibernate原生SessionHibernateEntityManager hibem = (HibernateEntityManager) em;Session session = hibem.getSession();// 方法2// Session session2 = (Session) hibem.getDelegate();// 极少情况下,能够从Hibernate Session退出到简单的JDBC接口// Connection jdbcConnection = session.connection();}}
这最后一个选项有一些警告:不允许你关闭从Hibernate中获得的JDBC Connection——它会自动进行。
      直接访问JDBC连接的一种更好更安全的方法是通过Java EE5.0中的资源注入。在一个EJB、EJB监听器、servlet、servlet过滤器甚至JavaServer Faces backing bean(JSF)中,注解一个字段或者设置方法,像下面这样:
@Resource(mappedName="java:/BdqnDS") DataSource ds;
      目前为止,假设你是在一个没有涉及遗留应用程序代码(或者现有的数据库Schema)的新Hibernate或者新JPA项目上进行。现在转换一下视角,考虑一个自底而上的开发过程。在这样一个场景中,你或许想要自动地从现有的数据库Schema中反射工程所需要创建的东西。
1 0