全称是:Java Persistence API (java 持久化应用接口),是由sun公司带头制定的。由于目前有很多java持久层的框架,比如Hibernate、TopLink、OpeanJPA等等。

JPA的总体思想和现有hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
  1. ORM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
  2. JPA的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
  3. 查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

二、JPA的主要API都定义在javax.persistence包中。与Hibernate对照如下:
————————————————–

三、实体生命周期

描述了实体对象从创建到受控、从删除到游离的状态变换。对实体的操作主要就是改变实体的状态。

1.New,新创建的实体对象,没有主键(identity)值
2.Managed,对象处于Persistence Context(持久化上下文)中,被EntityManager管理
3.Detached,对象已经游离到Persistence Context之外,进入Application Domain
4.Removed, 实体对象被删除
EntityManager提供一系列的方法管理实体对象的生命周期,包括:
1.persist, 将新创建的或已删除的实体转变为Managed状态,数据存入数据库。
2.remove,删除受控实体
3.merge,将游离实体转变为Managed状态,数据存入数据库。
如果使用了事务管理,则事务的commit/rollback也会改变实体的状态。

四、实体关系映射(ORM)

  1. 基本映射


2. ID生成策略
ID对应数据库表的主键,是保证唯一性的重要属性。JPA提供了以下几种ID生成策略
(1) GeneratorType.AUTO ,由JPA自动生成
(2) GenerationType.IDENTITY,使用数据库的自增长字段,需要数据库的支持(如SQL Server、MySQL、DB2、Derby等)
(3) GenerationType.SEQUENCE,使用数据库的序列号,需要数据库的支持(如Oracle)
(4) GenerationType.TABLE,使用指定的数据库表记录ID的增长 需要定义一个TableGenerator,在@GeneratedValue中引用。例如:
@TableGenerator( name=”myGenerator”, table=”GENERATORTABLE”, pkColumnName = “ENTITYNAME”, pkColumnValue=”MyEntity”, valueColumnName = “PKVALUE”, allocationSize=1 )

@GeneratedValue(strategy = GenerationType.TABLE,generator=”myGenerator”)

  1. 关联关系
    JPA定义了one-to-one、one-to-many、many-to-one、many-to-many 4种关系。
    对于数据库来说,通常在一个表中记录对另一个表的外键关联;对应到实体对象,持有关联数据的一方称为owning-side,另一方称为inverse-side。
    为了编程的方便,我们经常会希望在inverse-side也能引用到owning-side的对象,此时就构建了双向关联关系。 在双向关联中,需要在inverse-side定义mappedBy属性,以指明在owning-side是哪一个属性持有的关联数据。
    对关联关系映射的要点如下:

    其中 many-to-many关系的owning-side可以使用@JoinTable声明自定义关联表,比如Book和Author之间的关联表:
    @JoinTable(name = “BOOKAUTHOR”, joinColumns = { @JoinColumn(name = “BOOKID”, referencedColumnName = “id”) }, inverseJoinColumns = { @JoinColumn(name = “AUTHORID”, referencedColumnName = “id”) })
    关联关系还可以定制延迟加载和级联操作的行为(owning-side和inverse-side可以分别设置):
    通过设置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER来决定关联对象是延迟加载或立即加载。
    通过设置cascade={options}可以设置级联操作的行为,其中options可以是以下组合:
    CascadeType.MERGE 级联更新
    CascadeType.PERSIST 级联保存
    CascadeType.REFRESH 级联刷新
    CascadeType.REMOVE 级联删除
    CascadeType.ALL 级联上述4种操作
  2. 继承关系
    JPA通过在父类增加@Inheritance(strategy=InheritanceType.xxx)来声明继承关系。A支持3种继承策略:
    (1) 单表继承(InheritanceType.SINGLETABLE),所有继承树上的类共用一张表,在父类指定(@DiscriminatorColumn)声明并在每个类指定@DiscriminatorValue来区分类型。
    (2) 类表继承(InheritanceType.JOINED),父子类共同的部分公用一张表,其余部分保存到各自的表,通过join进行关联。
    (3) 具体表继承(InheritanceType.TABLEPERCLASS),每个具体类映射到自己的表。
    其中1和2能够支持多态,但是1需要允许字段为NULL,2需要多个JOIN关系;3最适合关系数据库,对多态支持不好。具体应用时根据需要取舍。

java EE中JPA介绍相关推荐

  1. flyway数据迁移_使用Flyway在Java EE中进行数据库迁移

    flyway数据迁移 任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展. 这使得数据库迁移对于任何Java EE应用程序都很重要. 您是否还在执行应用程序时手动执行它们? 它仍然是一个锁 ...

  2. Java EE中的RESTful计时器

    在这篇文章中.... EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新(2015年7月14日) 现在可以在OpenShift上使用该应用程序的前端 . 由于我是前端新 ...

  3. 使用Flyway在Java EE中进行数据库迁移

    任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展. 这使得数据库迁移对于任何Java EE应用程序都非常重要. 您是否还在执行应用程序时手动执行它们? 它仍然是一个锁定步骤过程,还是作为 ...

  4. Java EE中的配置管理

    我尝试配置管理在云计算中具有很多相关性 争论 较早. 实际上,我大胆地宣称配置管理是任何认真尝试从软件中节省几美元的基石. 那么什么是配置管理及其主要目标? 在不使事情变得过于复杂的情况下,我认为接下 ...

  5. 在JAVA EE中配置hibernate以及hibernate hello world

    为什么80%的码农都做不了架构师?>>>    这篇文章主要介绍hibernate的配置以及如何实现hello world.至于如何使用maven等工具获取到hibernate的ja ...

  6. Java EE中Ajax技术简单实现

    一.Ajax技术介绍 Ajax实际上并不是新技术,而是几个老技术的融合. Ajax包含以下五个部分: 1.异步数据获取技术,使用XMLHttpRequest. 2.基于标准的表示技术,使用XHTML与 ...

  7. mongo java mapreduce_MongoDB中MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  8. java ee中javamail注解_JavaEE之注解

    1注解:Annotation注解,是一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次,给计算机,JVM提供解读信息的. 2注解的作用:编译检查:代码分析,编 ...

  9. Java EE中的重新验证(java.util.regex.Pattern)

    java.lang.Objectjava.util.regex.Pattern 所有已实现的接口: Serializable public final class Pattern extends Ob ...

最新文章

  1. PHP设计模式之装饰模式(Decorator)
  2. 阿里古谦:阿里互联网架构的6大最佳实践-博客-云栖社区-阿里云
  3. Mule ESB-3.Build a webservice proxy
  4. 基本概念—机器学习ML与深度学习DL
  5. Bada学习- C++以及Flash应用开发流程之创建应用工程
  6. Java字符类isUpperCase()方法与示例
  7. 敏捷武士:看敏捷高手交付卓越软件pdf
  8. 人类为什么没有尾巴?这个跳跃基因抹去了人类的尾巴,并带来了额外风险
  9. Mysql用户访问工作原理
  10. Docker 监控- Prometheus VS Cloud Insight
  11. Hadoop之倒排索引
  12. (转)基于.Net的单点登录(SSO)解决方案(1)
  13. 能打开QQ,但打开不了网页-网络热门故障排查
  14. 炫酷好玩好用的卫星全景地图
  15. ROS日记:ROS系统的备份和还原
  16. android 浮窗示例代码,Android 浮窗开发之窗口层级(示例代码)
  17. 持久内存指令(PMDK)简介
  18. 自定义notepad++ --添加插件SourceCookifier
  19. badatatable转成json_数据表转换成json(DatatableToJson)
  20. 为什么你看书记不住,记住不会用?-我的技术学习方法论

热门文章

  1. 【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果
  2. 蓝桥杯 试题 基础练习 特殊回文数——16行代码AC
  3. 大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除
  4. Linux上(Redhat7)实现NFS文件共享服务
  5. excel查标准正态分布_终于搞清楚正态分布、指数分布到底是个啥了
  6. php的通用变量,认识并使用PHP的全局变量
  7. cdn厂商 同兴万点_同兴万点:TXNetworks和CDNetworks让我们傻傻分不清
  8. python 非线性规划_自动驾驶运动规划-Hybird A*算法(续)
  9. 液晶弹性自由能计算_自由能方法应用(一)开放计算平台BRIDGE的介绍及使用案例...
  10. 关系代数的自然连接符号_初中数学知识清单之代数式的认识