切换到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=directorypackage 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原生Configuration
Configuration hcfg = cfg.getHibernateConfiguration();
HibernateEntityManagerFactory hibemf = (HibernateEntityManagerFactory) emf;
// 使用Hibernate原生SessionFactory
SessionFactory sessionFactory = hibemf.getSessionFactory();
EntityManager em = emf.createEntityManager();
// 使用Hibernate原生Session
HibernateEntityManager 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中反射工程所需要创建的东西。