jpa框架_与框架无关的JPA

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批注。

Eclipse中的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放在运行时类路径中即可。

翻译自: https://blog.frankel.ch/framework-agnostic-jpa/

jpa框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值