jpa框架
伴随着新的JEE 5标准,出现了EJB3规范。 从历史的角度来看,EJB有3种不同的风格:(i)持久性实体,(ii)用于业务逻辑的会话,以及(iii)用于侦听器的消息驱动。 实体EJB在其2.1版本中开发最耗时。 除了EJB固有的复杂性(本地和远程接口,本地)外,由于映射机制的原因,开发EJB 2容易出错。 总而言之,EJB 2开发确实需要非常专业的IDE和专家开发人员。 这就是EJB 2未能获得可观的市场份额,而不得不与JDO,Hibernate和其他第三方框架竞争的主要原因。
Sun最终意识到了这一点,并确实为EJB 3提供了更为简单的解决方案。使用Java 5批注,开发Entity EJB 3变得轻而易举。 EJB 3规范中涉及实体的部分称为Java Persistence API(JPA)。 它本身就是一个规范,在下一个规范中,它将具有自己的规范。 开发JPA应用程序是一个两步过程。 首先,您必须创建模型类。 这些类将是您的持久层的基础:在整个组织中使用此层是一个好主意,因为这些类应紧密映射您的数据库模型。 一个简单的JPA增强类如下所示:
importstaticjavax.persistence.GenerationType.IDENTITY;
importjava.io.Serializable;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.Id;
@Entity
publicclassBookimplementsSerializable{
/** Unique class's serial version identifier. */
privatestaticfinallongserialVersionUID=7292903017883188330L;
/** Book's unique identifier. */
@Id
@GeneratedValue(strategy=IDENTITY)
privatelongid;
/** ISBN. */
privateStringisbn;
/** Book's title. */
privateStringtitle;
/** Publication's date. */
privateDatepublished;
publiclonggetId(){
returnid;
}
publicStringgetIsbn(){
returnisbn;
}
publicDategetPublished(){
returnpublished;
}
publicStringgetTitle(){
returntitle;
}
publicvoidsetId(longaId){
id=aId;
}
publicvoidsetIsbn(StringaIsbn){
isbn=aIsbn;
}
publicvoidsetPublished(DateaPublished){
published=aPublished;
}
publicvoidsetTitle(StringaTitle){
title=aTitle;
}
您已经注意到3个注释:
-
javax.persistence.Entity
(第9行):只是此注释使JPA可以使用模型的类, -
javax.persistence.Id
(第16行):标识主键列, -
javax.persistence.GeneratedValue
(第17行):如何在插入时生成PK。
将类映射到数据库是JPA的最重要操作。 这超出了本文的范围,至少可以说是使用上面的3个注解。
如果您使用的是Eclipse,并且不想学习所有JPA批注,则建议使用JPA facet。 只需右键单击您的项目,选择“属性”并转到“项目构面”。 然后选择Java Persistence。 除了创建所需的配置文件(见下文)并为其提供漂亮的实用程序视图外,它还为每个模型类提供两个视图:
- JPA Structure应该映射您的数据库结构,
- JPA详细信息,您可以在其中添加和更改JPA批注。
一旦完成映射,无论是通过蛮力还是上面提供的整洁的小向导,如何对这些实体进行CRUD? 首先,您可以继续使用最喜欢的JPA兼容持久性框架。 就我而言,我使用的是Hibernate,它恰好是JPA参考实现。 以下代码被调用一次,最好在实用程序类中调用一次:
AnnotationConfigurationconfiguration=newAnnotationConfiguration();
configuration.addAnnotatedClass(Book.class);
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
现在,您只需要获取每个工作单元的会话,并在您的<acronym title =“ Data Access Object”> DAO </ acronym>中使用它:
Sessionsession=sessionFactory.getSession();
// Get every book in database
Listbooks=session.createCriteria(Book.class).list();
现在,我们获得了独立于Hibernate的模型类,但我们的DAO却不是。 由于使用JPA API而不是Hibernate API可以将我们的代码与底层框架分离,而这并不会显着降低性能,因此非常需要删除此依赖项。 您需要具备:
- 对ejb3-persistence.jar的编译时依赖性,
- 对hibernate-entitymanager.jar或其等效的TopLink的运行时依赖项。 传递依存性当然取决于框架。
JPA配置通过2个文件完成:
-
META-INF/orm.xml
用于映射信息。 在我们的例子中,已经使用注释完成了。 -
META-INF/persistence.xml
用于元信息,例如要使用的数据源的JNDI位置。
完成后,调用顺序与Hibernate的非常相似:
// This done once per application
// Notice its similitude with Hibernate's SessionFactory
EntityManagerFactoryemf=Persistence.createEntityManagerFactory("myManager");
// This done per unit of work
// Notice its similitude with Hibernate's Session
EntityManagerem=emf.createEntityManager();
// Get every book in database
Listbooks=em.createQuery("SELECT b FROM Book").getResultList();
现在,使用上面的代码,从Hibernate实现到TopLink实现的传递是透明的。 只需删除Hibernate JAR,然后将TopLink JAR放在运行时类路径中即可。
jpa框架