`
foryougeljh
  • 浏览: 116470 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JPA入门

 
阅读更多

JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术.

采用JPA的实现hibernate开发必须的包
hibernate核心包hibernate-distribution-3.3.1.GA
hibernate3.jar
lib/bytecode/cglib/hibernate-cglib-repack-2.1_3.jar
lib/required/*.jar
Hiberante注解包hibernate-annotations-3.4.0.GA
hibernate-annotations.jar
lib/ejb3-persistence.jar、hibernate-commons-annotations.jar
Hibernate针对JPA的实现包hibernate-entitymanager-3.4.0.GA
hibernate-entitymanager.jar
lib/test/log4j.jar、slf4j-log4j12.jar

JPA的配置文件

JPA规范要求在类路径的META-INF目录下放置persistence.xml,文件的名称是固定的,配置模版如下:
<?xml version="1.0"?>
<persistence 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_1_0.xsd" version="1.0">
<!-- 供应商 -->
<persistence-unit name="itcast" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

JPA事务分为 RESOURCE_LOCAL本地事务、JTA(全局事务)
J2ee环境中默认是JTA
J2se环境中默认是Resource-local

实体 bean映射
@Entity注释指明这是一个实体 Bean,
@Table 注释指定了entity所要映射的数据库表,name属性指定映射表的表名。缺省系统默认采用类名作为表名
@Column 注释定义了将成员属性映射到关系表中的哪一列和该列的一些结构信息
name:映射的列名,unique: 是否唯一,nullable: 是否允许为空,length: 对于字符型列,length列的最大字符长度
@Id 注释指定属性为表的主键
@GeneratedValue 注释定义了标识字段的生成方式
AUTO:由容器挑选一个合适的方式来保证唯一
NONE:容器不负责主键的生成,由调用程序来完成
@Temporal注释用来指定与数据库对应时间类型属性映射,默认值为:TIMESTAMP
DATE, //代表 date 类型
TIME, //代表时间类型
TIMESTAMP //代表时间戳类型
@PersistenceContext 注释指明容器在实例化SessionBean 后,动态注入EntityManager对象,如果persistence.xml文件中配置了多个不同的持久化单元。在注入EntityManager 时必须指定持久化名称,可以通过 @PersistenceContext注释的unitName属性进行指定,如果只有一个持久化内容配置,不需要明确指定
@Transient注释让一些成员属性不映射成数据库字段
@Enumerated 注释映射枚举对象到数据库
@Basic对于加了@Lob 注释的大数据类型,为了避免每次加载实体时占用大量内存,@Basic(fetch=FetchType.LAZY)延迟加载
@Lob数据字段类型为Clob和Blob类型映射

初始化
EntityManagerFactory emf = Persistence.createEntityManagerFactory("持久化单元名称");
还有另一种方法
Map configOverrides = new HashMap();//可编程配置
configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
EntityManagerFactory programmaticEmf = Persistence.createEntityManagerFactory("持久化单元名称", configOverrides);
注: 启动时,ClassLoader.getResource("META-INF/persistence.xml")

实体
@Entity
public class Employee {
age ;
setxxx();
}
每个实体必须有 ID,映射到主键

EJB3规范在被访问的元素类型上声明注解.比如方法访问,需要在getXXX上声明注解,字段级访问 就在属性上声明注解.不支持混合使用.Hibernate会通过@id/@Embeddedid的位置来判断采用哪种访问方式.

实体管理器
EntityManagerFactory emf = Persistence.createEntityManagerFactory("持久化单元名称")
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
em.xxx();
tx.commit();
em.close();
emf.close();


@TransactionAttribute注解
TransactionAttributeType.REQUIRED
TransactionAttributeType.REQUIRES_NEW
TransactionAttributeType.MANDATORY
TransactionAttributeType.NOT_SUPPORTED
TransactionAttributeType.NEVER
TransactionAttributeType.SUPPORTS

JPA的CRUD操作
EntityManager相当于 hibernate 中的 session.控制实体的生命周期.

find()或 getReference()方法根据Entity的唯一标示符来获得 Entity,find()方法不支持延迟加载,当在数据库中没有找到记录时,find()方法会返回 null。而getReference()方法支持延迟加载,当在数据库中没有找到记录时会抛出EntityNotFoundException。
em.remove(em.getReference(Person.class, 1)) 执行的 SQL (delete from Person where personid = 1)
em.remove(em.find(Person.class,1)) 执行的 SQL
select * from Person where personid = 1 delete from Person where personid = 1
em.getReference()不会真正去做数据库的 select 操作,而是把托管的 Person 实例返回出来

persist()保存 Entity到数据库
当实体正在被容器管理时,你可以调用实体的 set方法对数据进行修改,在容器决定 flush 时,更新的数据才会同步到数据库。

merge()
merge ()方法是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定 flush 时,数据将会同步到数据库中。

remove() 把 Entity从到数据库中删除。

refresh()
如果你怀疑当前被管理的实体已经不是数据库中最新的数据,你可以通过 refresh()方法刷新实体

contains()检测实体当前是否被管理中

clear()
在处理大量实体的时候,如果你不把已经处理过的实体从 EntityManager 中分离出来,将会消耗你大量的内存。调用 EntityManager 的 clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来

flush() 将实体的改变立刻刷新到数据库中

当调用 persist( ), merge( )或 remove( )这些方法时,更新并不会立刻同步到数据库中,直到容器决定刷新到数据库中时才会执行,

默认情况下,容器决定刷新是在"相关查询"执行前或事务提交时发生,当然"相关查询"除find()和 getreference()之外,这两个方法是不会引起容器触发刷新动作的,默认的刷新模式是可以改变的改变实体管理器的 Flush模式 setFlushMode()

默认情况下,实体管理器的 Flush 模式为 AUTO
FlushModeType.AUTO: 刷新在查询语句执行前(除了find()和 getreference()查询)或事务提交时才发生,使用场合:在大量更新数据的过程中没有任何查询语句(除了 find()和 getreference()查询)的执行。

FlushModeType.COMMIT:刷新只有在事务提交时才发生,在大量更新数据的过程中存在查询语句(除了find()和 getreference()查询)的执行。

上面两种模式最终反映的结果是:JDBC驱动跟数据库交互的次数。JDBC性能最大的增进是减少JDBC驱动与数据库之间的网络通讯。 FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互
分享到:
评论

相关推荐

    JPA入门(一)

    **JPA入门(一)** Java Persistence API(JPA)是Java平台上的一个标准,用于对象关系映射(ORM),它允许开发人员使用面向对象的编程模型来操作数据库。这篇入门教程将帮助初学者理解JPA的基本概念和用法。 **1....

    spring data jpa入门实例

    【Spring Data JPA 入门实例】 Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问层(DAO)的开发,通过提供自动化的 Repository 实现,使得开发者无需编写大量的 CRUD(创建、读取、更新、删除)代码...

    Spring Data JPA入门项目02

    在本项目"Spring Data JPA入门项目02"中,我们将深入探讨如何使用Spring Data JPA进行查询操作,包括排序和分页。Spring Data JPA是Spring Framework的一个模块,它为Java Persistence API (JPA) 提供了一种更加便捷...

    Spring Data JPA入门项目01

    在这个"Spring Data JPA入门项目01"中,我们将探讨如何利用Spring Data JPA来实现基本的CRUD(创建、读取、更新和删除)功能。 首先,我们需要在项目中引入Spring Data JPA的相关依赖。这通常在Maven或Gradle的配置...

    spring Data Jpa入门

    Spring Framework对JPA的支持本身就很强大,我们不用理会EntityManager的创建,事务处理等等.Spring又进步了,只需要声明一下方法接口,Spring Data JPA可以帮你完成数据访问层的实现代码,开发者把更多的心思放在业务...

    Spring Data JPA 入门例子极简代码

    **Spring Data JPA 入门详解** Spring Data JPA 是 Spring 框架的一个模块,它简化了数据库访问,提供了一种声明式的方式来处理数据访问层的 CRUD(创建、读取、更新、删除)操作。它与 Java Persistence API (JPA)...

    JSF+JPA入门开发示例

    在"JSF+JPA入门开发示例"中,你可能会学习到以下关键知识点: 1. **JSF生命周期**:JSF组件有六个主要阶段,包括恢复视图、应用请求值、处理验证、更新模型值、调用应用程序和渲染响应。理解每个阶段的功能对于调试...

    hibernate jpa 入门案例依赖jar

    本篇文章将深入探讨Hibernate JPA入门案例所需的依赖,以及如何配置MySQL驱动。 首先,我们需要理解Hibernate和JPA的关系。Hibernate是最初的ORM框架,提供了全面的功能来处理数据库交互。而JPA是Java EE的一部分,...

    SpringDataJPA入门

    **SpringDataJPA入门:用户管理系统** 在Java开发领域,Spring框架是不可或缺的一部分,而SpringDataJPA则是Spring框架中的一个重要模块,它为开发者提供了访问数据库的便捷方式。本教程将引导你入门SpringDataJPA...

    JPA入门(二)

    **JPA入门(二)** Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的数据。它是Java EE和Java SE环境中的一种ORM(对象关系映射)解决方案,使得开发人员可以使用面向对象的编程模型来...

    hibernate+strut+jpa入门例子.zip

    【标题】:“Hibernate+Struts+JPA入门例子”是一个典型的Java Web开发示例,它结合了三个重要的技术框架:Hibernate、Struts和Java Persistence API(JPA)。这个压缩包包含了一个初学者如何将这三个框架整合到一个...

    事物JPA入门

    **事物(Transaction)JPA 入门** Java Persistence API(JPA)是Java平台上的一个标准,用于管理和持久化Java对象到关系数据库。它提供了一种面向对象的方式来处理数据库操作,使得开发人员可以避免直接编写SQL,...

    JPA从入门到精通

    jpa从入门到放弃,你值得拥有!!!!!

    JPA入门Demo

    在"JPA入门Demo"中,我们可以看到如何使用这些概念和API来创建一个简单的JPA应用,包括定义实体类、设置关联关系、编写查询语句以及进行数据操作。通过实践这些示例,开发者可以更好地理解和掌握JPA在实际项目中的...

    jpa入门范例

    通过提供的"jpa入门范例"项目,初学者可以实际操作,深入理解JPA的工作原理和用法。这个项目可能包含了创建实体、配置数据源、执行CRUD操作、以及处理关联关系等基本示例,非常适合初学者练习和实践。

    spring data jpa 入门例子

    本入门例子将帮助你理解并掌握Spring Data JPA的核心概念和常用功能。 1. **什么是Spring Data JPA** Spring Data JPA是Spring框架的一部分,它为JPA提供了一种声明式的方法来处理数据访问层。通过使用Spring Data...

Global site tag (gtag.js) - Google Analytics