【JavaEE】经典JAVA EE企业应用实战-读书笔记13

JPA规范并不是任何具体的ORM框架,只是一种规范。因此当在程序中使用JPA进行持久化时,底层一定需要具体的ORM框架作为实现。

ORM全称Object/Relation Mapping

JPA提供了实体和数据表之间的映射关系,JPA规范大致上遵循以下几条映射准则。

1)数据表映射实体类:实体类被映射到一个数据表。当我们使用这个实体类来创建实例、修改属性、删除实例时,系统自动会转换为对这个表进行CRUD操作。

2)数据表的行映射实体对象(即实例):实体类会生成很多实体,每个实体就对应数据表中的一行记录。当我们在应用中修改某个实体对象时,JPA将会转换成对指定数据表中特定行的操作。

3)数据表的列(字段)映射实体的属性:当我们在应用中修改某个实体对象的指定属性时(实体对象映射到数据行),JPA将会转换成对数据表中指定数据行、指定数据列的修改。

 

JPA操作中,最常用的3中组件如下

1)实体

就是一个普通的POJO,为他增加了orm.xml映射文件或Annotation,用于建立实体和底层数据库之间的对应关系。本身没有人任何持久化能力。

2)EntityManager

使用EntityManager对实体进行操作时,JPA规范才可将这种操作转换为对底层数据库的操作。类似Hibernate框架的Session

3)JPQL查询

类似于Hibernate提供的HQL查询语言,方便地检索已保存的实体。JPA提供了一个Query接口来执行查询,EntityManager根据已有的JPQL来创建Query对象,然后由Query对象来执行查询。

 

下面定义一个简单的实体类

@Entity
@Table(name = "news_table")
public class News {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;

	@Column(name = "news_title", length = 50)
	private String title;

	@Column(nullable = true)
	private String content;

	public News() {
}
//省略setter和getter方法
}

上面的注解都在javax.persistence包下

JPA需要使用persistence.xml来管理数据库连接、连接池信息,JPA将这些信息称为持久化单元。

 

成书时主流的JPA实现有HibernateTopLinkJPAOpenJPA

不管是那种JPA实现,应用程序所需要的persistence.xml文件总是应该放在应用类加载路径的META-INF(区分大小写)路径下。

下面是一个示例的persistence.xml文件,省略头部的相关信息

<persistence>
	<!-- 为持久化单元指定名称,并通过transaction-type指定事务类型
	transaction-type属性合法的属性值有JTA、RESOURCE_LOCAL两个 -->
	<persistence-unit name="qs" transaction-type="RESOURCE_LOCAL">
		<!-- 指定javax.persistence.spi.PersistenceProvider实现类 -->
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<!-- 列出改应用需要访问的所有的Entity类
		也可以用<mapping-file>或<jar-file>元素来定义 -->
		<class>com.kingdz.model.News</class>
		<!-- properties元素用于为特定JPA实现配置对应的属性 -->
		<!-- 下面列举的是可以配置的部分属性 -->
		<properties>
			<!-- 指定连接数据库的驱动名 -->
			<property name="hibernate.connection.driver_class"
				value="com.mysql.jdbc.Driver"/>
			<!-- 指定连接数据库的URL -->
			<property name="hibernate.connection.url"
				value="jdbc:mysql://localhost:3306/javaee"/>
			<!-- 指定连接数据库的用户名 -->
			<property name="hibernate.connection.username"
				value="root"/>
			<!-- 指定连接数据库的密码 -->
			<property name="hibernate.connection.password"
				value="123456"/>
			<!-- 指定连接数据库的方言 -->
			<property name="hibernate.dialect"
				value="org.hibernate.dialect.MySQLInnoDBDialect"/>
			<!-- 设置是否格式化SQL语句 -->
			<property name="hibernate.format_sql"
				value="true"/>
			<!-- 设置是否根据要求自动建表 -->
			<property name="hibernate.hbm2ddl.auto"
				value="update"/>
		</properties>
	</persistence-unit>
</persistence>

trans action-type属性指定了该持久化单元的事务类型

1)JTA:使用JTA全局事务。在应用服务器中使用JPA时,该属性为默认值。指定该属性值时还需要使用<jta-data-source>元素指定容器管理的XA事务源,也就是JTA数据源的JNDI名称。

2)RESOURCE_LOCAL:使用局部事务。JavaSE程序通常采用局部事务。

 

persistence-unit元素还包含如下3个子元素

1)provider:指定JPA实现的提供类,在应用服务器中无需指定

2)classmapping-filejar-file:这3个元素用于指定实体。class元素指定实体的类名。mapping-file指定实体类的映射文件。jar-file指定实体类所在的JAR

3)properties:可包含多个property子元素,用于为特定JPA实现配置对应的属性。

 

对于Hibernate JPA实现,可以指定如下常用属性

1)hibernat.ejb.cfgfile:指定Hibernate配置文件的为准

2)hibernate.archieve.autodetection:指定创建Entity Manager时搜索文件的类型,多个值之间用逗号分隔。该属性支持clashbm,默认两个都搜索。

3)hbiernate.ejb.interceptor:指定自定义拦截器。该拦截器必须实现org.hibernate.Interceptor接口,并且提供无参构造器。

4)hibernate.ejb.event.<eventtype>:为Hibernate特定事件指定事件监听器

如:<property name=hibernate.ejb.event.create value=kingdz.CreateListener />

5)hibernate.cache.provider_class:指定Hibernate二级缓存的实现类的类名

6)hibernate.cache.use_minimal_puts:指定是否优化二级缓存来最小化读写操作,该属性在集群环境中进行缓存优化。支持true(默认值,启用最小化读写操作)和false

7)hibernate.cache.use_query_cache:是否缓存查询结果

8)hibernate.cache.use_second_level_cache:是否启用二级缓存

9)hibernate.cache.query_cache_factory:设置自定义的查询缓存类的类名,缓存类必须实现org.hibernate.cache.QueryCache接口。默认值是org.hibernate.cache.StandardQueryCache

10)hibernate.cache.region_perfix:指定二级缓存的前缀名称

11)hibernate.cache.use_structured_entries:指定是否使用结构化方式来缓存对象

12)hibernate.jdbc.fetch_size:定义JDBC抓取记录的数量。相当于调用StatementsetFetchSize()方法。默认值是25

13)hibernate.jdbc.batch_size:设置Hibernate批量操作的数量

14)hibernate.jdbc.batch_versioned_date:设置JDBC执行批量操作时是否更新版本数据

15)hibernate.jdbc.use_scrollable_resultset:是否允许Hibernate使用JDBC2的可滚动结果集

16)hibernate.connection.isolation:设置JDBC事务的隔离级别。

17)hibernate.connection.autocommit:是否采用JDBC自动提交

18)hibernate.connection.driver_class:连接数据库的驱动类的全限定类名

19)hibernate.connection.url:连接数据库的URL

20)hibernate.connection.username:连接数据库的用户名

21)hibernate.connection.password:连接数据库的密码

22)hibernate.dialect:连接数据库使用的方言

23)hibernate.show_sql:设置执行持久化时是否显示对应的SQL语句

24)hibernate.format_sql:输出SQL语句时是否对语句进行格式化

25)hibernate.use_sql_comments:是否输出SQL注释

26)hibernate.generate_statistics:是否手机与运行性能有关的参数

27)hibernate.hbm2ddl.auto:是否根据实体来自动创建数据表。支持create-drop(先创建,用完后删除)、update(更新)和validate(只进行验证)等属性值

28)hibernate.default_schema:指定所创建数据库对象默认的Schema

29)hibernate.default_catalog:指定所创建数据库对象默认的Catalog

30)hibernate.max_fetch_depth:设置关联实体的最大抓取深度。0表示不抓取关联实体。建议值在0~3之间,默认为1

31)hibernate.default_batch_fetch_size:设置加载关联实体集时所加载的关联实体的个数,建议使用2的倍数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值