您的位置:首页 > 编程语言 > Java开发

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

2017-03-02 17:49 387 查看
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实现有Hibernate、TopLinkJPA、OpenJPA。
不管是那种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>

transaction-type属性指定了该持久化单元的事务类型
1)JTA:使用JTA全局事务。在应用服务器中使用JPA时,该属性为默认值。指定该属性值时还需要使用<jta-data-source>元素指定容器管理的XA事务源,也就是JTA数据源的JNDI名称。
2)RESOURCE_LOCAL:使用局部事务。JavaSE程序通常采用局部事务。
 
persistence-unit元素还包含如下3个子元素
1)provider:指定JPA实现的提供类,在应用服务器中无需指定
2)class、mapping-file、jar-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时搜索文件的类型,多个值之间用逗号分隔。该属性支持clas和hbm,默认两个都搜索。
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抓取记录的数量。相当于调用Statement的setFetchSize()方法。默认值是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的倍数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: