原创 | 使用 JPA 实现 DDD 持久化 - 数据库连接配置:persistence.xml
第二节 数据库连接配置:persistence.xml
为了通过JPA
将领域对象的状态持久化到数据库,必须告知JPA
数据库的类型、位置、账号访问等相关信息。根据JPA
规范,这些信息应该定义在类路径下的META-INF/persistence.xml
文件中。在maven
项目中,应该在包含持久化类的tmall-domain
模块的main/resources/META-INF
目录下创建persistence.xml
文件。
Java SE
环境下典型的persistence.xml
文件内容如下:
Java EE
环境下典型的persistence.xml
文件内容如下:
一、根节点 persistence
persistence
根节点定义所采用的JPA
规范的版本。目前最新的JPA
规范版本是2.2
。
二、持久化单元节点 persistence-unit
在根节点persistence
下可以创建多个持久化单元persistence-unit
。绝大多数情况下项目中都只有一个持久化单元。
每个persistence-unit
节点定义一个持久化单元。一个持久化单元代表到一个数据库的连接和映射。
persistence-unit
节点有两个属性:
name
属性:持久化单元的名称。这个名称必须在整个系统内是唯一的。后续通过JPA API
访问数据库时必须提供相应的持久化单元的名称。transaction-type
属性:指定持久化单元采用的事务类型。有两个可用选项:RESOURCE_LOCAL
:适用于Java SE
环境。由应用代码负责创建和管理数据库事务。JTA
:适用于Java EE
环境。由应用服务器(例如WebSphere
、JBoss
等。如今已经几乎绝迹)创建和管理事务。需要在应用服务器上创建连接到数据库的数据源,并以JNDI
名称的形式暴露给JPA
。在Java SE
环境中,如果需要跨越多个事务资源(例如数据库、JMS
服务等)的事务,那么也需要使用JTA
事务类型。Servlet
容器(如Tomcat
、Jetty
等)一般不直接支持JTA
事务,这时可以采用Bitronix BTM
等第三方类库帮助实现JTA
事务。
在persistence-unit
节点下还定义了以下的子节点:
provider
节点:指定持久化提供者实现类。本范例项目使用的是hibernate
的JPA
持久化提供者实现类HibernatePersistenceProvider
。description
节点:可选的持久化单元描述。jta-data-source
节点:持久化单元使用的JTA
数据源,指向容器提供的JTA
数据源的JNDI
路径。持久化单元transaction-type
的属性值是JTA
时采用。non-jta-data-source
属性:持久化单元使用的非JTA
数据源,指向容器提供的JTA
数据源的JNDI
路径。持久化单元transaction-type
属性值是RESOURCE_LOCAL
时采用。
jta-data-source
和non-jta-data-source
都是采用容器提供的数据源进行持久化。在Java SE
环境下,也可以不采用容器提供的数据源,而采用下文中的几个JPA
标准属性定义数据库连接信息。
三、持久化单元属性集节点 properties
持久化单元节点persistence-unit
在properties
子节点下通过若干个property
下级节点定义一批持久化相关属性。这些属性可分为两类:名字以javax.persistence
开头的JPA
标准属性,以及不以javax.persistence
开头的扩展属性,包括持久化框架特定的属性、数据库连接池相关属性、缓存相关属性等等。
名字以javax.persistence
开头的属性是JPA
定义的标准属性:
javax.persistence.jdbc.driver
属性:定义所使用的数据库驱动类。javax.persistence.jdbc.url
属性:定义所使用数据库的JDBC url
。javax.persistence.jdbc.user
属性:定义访问数据库的用户名。javax.persistence.jdbc.password
属性:定义访问数据库的用户口令。
以上四个属性指定数据库连接基本信息。如果已经通过jta-data-source
节点指定了容器提供的JTA
数据源,或通过none-jta-data-source
节点指定了容器提供的非JTA
数据源,则无需定义这几个数据库连接属性。
名字以hibernate
开头的属性是JPA
实现框架Hibernate
定义的扩展属性:
hibernate.show_sql
属性:如果设置为true
,将在运行时在后台打印Hibernate
生成的SQL
语句。hibernate.hbm2ddl.auto
属性:定义每次加载hibernate
时是否创建或更新数据库结构。有以下几个选项(一般建议:在开发和测试时设置为update
(如果在测试之间要保留之前创建的数据)或create
(如果不想保留历史数据,每次测试从 0 开始),而在生产环境中设置为none
以防止每次启动时误删生产数据):create
:每次加载hibernate
时都会删除上一次的生成的表,然后根据映射元数据重新生成表。相当于drop-create
。create-drop
:每次加载hibernate
时根据映射元数据生成表,但是sessionFactory
一关闭,表就自动删除。update
:最常用的属性。第一次加载hibernate
时根据映射元数据自动建立起表的结构(前提是先建立好数据库),以后每次加载hibernate
时映射元数据的变化(例如创建了新的持久化类、修改了现有的持久化类、修改了映射元数据等)自动更新表结构,但是仍然会保留原有的数据行。validate
:每次加载hibernate
时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。none
:任何时候加载hibernate
时,都不会自动创建或修改表结构,也不会删除表。hibernate.dialect
属性:定义了进行O/R
映射时生成的数据库方言。因为JPA/Hibernate
支持面向多种数据库的持久化,而SQL
虽然有了标准,但每种数据库都可能只是部分遵从SQL
标准,除此之外,它们还可能拥有一些特有的SQL
语法。指定了数据库方言之后,hibernate
就知道如何将面向对象的对象查询语言(JPQL
)翻译转换为特定数据库的SQL
方言。
还有很多其他的标准属性和扩展属性,那些属性会在本教程的第三部分详细论述。
将持久化类(实体、值对象等)和persistence.xml
打包到一个jar
中,这个jar
就成为持久化存档文件。可以部署到应用服务器和Java Web
服务器上,或者打包到企业应用存档文件中。
详细内容请戳这里↓↓↓
原创 | 使用JPA实现DDD持久化-数据库连接配置:persistence.xml
这一节就讲到这里,下一节我们讲"领域模型:对象的世界"。
如果觉得有收获,点个【赞】鼓励一下呗!
版权声明: 本文为 InfoQ 作者【编程道与术】的原创文章。
原文链接:【http://xie.infoq.cn/article/a35ec283e95181acbee8a8af0】。文章转载请联系作者。
评论