首页 > 代码库 > JPA学习---第三节:搭建JPA开发环境和全局事务介绍

JPA学习---第三节:搭建JPA开发环境和全局事务介绍

一、创建 Java 项目

1、导入所需的 jar 包:

image

2、创建 persistence.xml 文件, 代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="learn_jpa" transaction-type="RESOURCE_LOCAL">
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
         
         <properties>
        <!-- 数据库方言 -->
        <property name="hibernate.dialect" value="http://www.mamicode.com/org.hibernate.dialect.MySQL5Dialect" />
        <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class" value="http://www.mamicode.com/com.mysql.jdbc.Driver" />
        <!-- 数据库用户名 -->
        <property name="hibernate.connection.username" value="http://www.mamicode.com/root" />
        <!-- 数据库密码 -->
        <property name="hibernate.connection.password" value="http://www.mamicode.com/hwl901121" />
        <!-- 数据库连接URL -->
        <property name="hibernate.connection.url" value="http://www.mamicode.com/jdbc:mysql://localhost:3306/learn_jpa?useUnicode=true&characterEncoding=UTF8"/>
        <!-- 最大抓取深度 -->
        <property name="hibernate.max_fetch_depth" value="http://www.mamicode.com/3" />
        <!-- 更新方式创建库表 -->
        <property name="hibernate.hbm2ddl.auto" value="http://www.mamicode.com/update" />
        <!-- 显示SQL -->
        <property name="hibernate.show_sql" value="http://www.mamicode.com/false" />
        <!-- 格式SQL -->
        <property name="hibernate.format_sql" value="http://www.mamicode.com/true" />
     </properties>
  </persistence-unit>
</persistence>

详解:

persistence-unit:持久化单元,简单说,就是代表一堆实体bean的集合,那么这堆实体bean,我们叫他们做实体bean单元。我们在学Hibernate就已知道,他们就是专门用于跟数据库映射的普
通的Java对象,在我们JPA里面,这些对象叫做实体bean。持久化单元就是一堆实体bean的集合,我们为这堆集合取个名称,<persistence-unit name="..."><persistence-unit/>,可以有好几个这样的持久化单元,也就是它们会和不同的数据库打交道。

name属性用于定义持久化单元的名字 (name必选,空值也合法); transaction-type 指定事务类型(可选 RESOURCE_LOCAL 或 JTA)

hibernate.hbm2ddl.auto:

参数的作用主要用于:自动创建|更新|验证数据库表结构

hibernate.hbm2ddl.auto 值:

create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

二、RESOURCE_LOCAL 管理事务和 JTA管理事务的区别:

1、JTA事务(Java Transaction API)是J2EE规范中有关事务的标准。它是容器级别的事务,只能运行在J2EE服务器中。它的最大优势是可以支持分布式的事务,如果系统采用的是分布式的数据库,那么只能选择JTA管理EntityManager事务。

使用JTA管理EntityManager事务时,需要注意以下几个问题。

— JTA事务只能运行在J2EE的环境中,即EJB容器中和Web容器中;而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。

— 容器托管的EntityManager对象只能采用JTA的事务,而不能采用RESOURCE_LOCAL事务。

2、RESOURCE_LOCAL事务数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用RESOURCE_LOCAL管理EntityManager事务。

使用RESOURCE_LOCAL管理EntityManager事务时需要注意以下几个问题。

— 在J2SE环境中,只能使用RESOURCE_LOCAL管理EntityManager事务,并且EntityManager对象是以应用托管方式获得的。

— 代码中使用RESOURCE_LOCAL管理事务时,要通过调用EntityManager的getTransac- tion()方法获得本地事务对象。

http://brushupo.blog.sohu.com/95340446.html

JPA学习---第三节:搭建JPA开发环境和全局事务介绍