原创 | 使用 JPA 实现 DDD 持久化 - 启动 JPA 程序 + 通过 JPA 原生 API 访问数据
启动JPA程序
本项目中,使用Hibernate
作为隐藏在JPA
幕后的ORM
框架。
在Java EE
环境中,由应用服务器负责启动JPA
。包含持久化单元(内含实体、值对象、映射元数据和persistence.xml
文件)的工件(war
或ear
存档文件)被部署到应用服务器之后,应用服务器会扫描持久化单元,读取persistence.xml
文件和映射元数据,据此启动JPA
程序。
在Java SE
环境下,由应用代码负责启动JPA
。基本步骤如下:
1、通过Persistence
类的静态工厂方法createEntityManagerFactory()
创建EntityManagerFactory
,传入持久化单元的名字作为参数(持久化单元的名字在/META-INF/persistence.xml
文件中定义)。
2、通过EntityManagerFactory
的createEntityManager()
方法创建EntityManager
。
3、使用EntityManager
进行各种持久化和查询操作。例如:
通过JPA原生API访问数据
JPA
的核心API
有这么几个:
EntityManagerFactory
系统中针对每个持久化单元创建一个对应的EntityManagerFactory
,它是EntityManager
的工厂。这个对象的创建是重量级的,同时也是线程安全的。一般在程序中是一次创建,重复使用,直至应用结束时才关闭。
EntityManager
实体管理器EntityManager
是JPA API
核心中的核心,从EntityManagerFactory
对象创建,代表对数据库的一次会话。它可以直接执行实体的增、删、改操作,并通过创建Query
对象执行实体查询操作。它的创建是轻量的,但不是线程安全的,应该按需创建,及时关闭。
EntityTransaction
对数据库的操作必然涉及事务问题。在Java EE
环境中,事务一般是由应用服务器容器管理的,应用代码可以不用考虑事务。但在Java SE
环境中,需要由应用代码来负责开始和提交/回滚事务。通过EntityManager
对象的getTransaction()
方法获取事务对象EntityTransaction
,在持久化操作开始前调用EntityTransaction
的begin()
方法开始一个事务,操作成功完成后调用它的commit()
方法提交事务,操作失败时调用它的rollback()
方法进行事务回滚。
Query
要对数据库执行查询,就需要通过EntityManager
对象的createQuery()
方法创建Query
对象,接受一个JPA
查询语言写成的查询字符串作为参数。查询可以返回单个结果(调用Query
对象的getSingleResult()
方法),一个列表(调用Query
对象的getResultList()
方法),一个流(调用Query
对象的getResultStream()
方法)等。
Query
还有一个变体TypedQuery
,支持泛型。当给EntityManager
对象的createQuery()
方法传入一个类对象作为第二个参数时将返回一个TypedQuery
对象。它能够返回适当类型的对象或泛型列表,而不需要强制类型转换。
下面是tmall-persistence-jpa
模块中的范例代码,OrderRepository
类用原生JPA API
实现了订单仓储接口Orders
:
我们编写集成测试类作为仓储的客户来调用仓储的持久化代码:
总结:在Java SE
环境中通过JPA
原生API
访问数据的步骤:
在应用启动时,针对每个持久化单元一次性创建
EntityManagerFactory
对象并缓存起来;对数据库的每一次访问:
从
EntityManagerFactory
对象中生成一个EntityManager
新实例;调用
EntityManager
的getTransaction()
方法获得EntityTransaction
事务对象;调用
EntityTransaction
的begin()
方法开始一个新的事务;在
try...catch...
语句内部调用EntityManager
的方法进行增删改查操作;当数据访问方法成功完成,调用
EntityTransaction
的commit()
方法提交事务;如果数据访问方法抛出异常,调用
EntityTransaction
的rollback()
方法回滚事务;调用
EntityManager
对象的close()
方法关闭它;当整个应用结束运行之前,调用
EntityManagerFactory
对象的close()
方法关闭它。
详细内容请戳这里↓↓↓
原创 | 使用JPA实现DDD持久化-启动JPA程序+通过JPA原生API访问数据
这一节就讲到这里,下一节我们讲"通过Spring Data JPA访问数据"。
如果觉得有收获,点个【赞】鼓励一下呗!
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb6e95fdf2cb0545218c6756f】。文章转载请联系作者。
评论