java EE中JPA介绍
全称是: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)
- 基本映射
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”)
- 关联关系
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种操作 - 继承关系
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介绍相关推荐
- flyway数据迁移_使用Flyway在Java EE中进行数据库迁移
flyway数据迁移 任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展. 这使得数据库迁移对于任何Java EE应用程序都很重要. 您是否还在执行应用程序时手动执行它们? 它仍然是一个锁 ...
- Java EE中的RESTful计时器
在这篇文章中.... EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新(2015年7月14日) 现在可以在OpenShift上使用该应用程序的前端 . 由于我是前端新 ...
- 使用Flyway在Java EE中进行数据库迁移
任何Java EE应用程序的数据库模式都会随着业务逻辑一起发展. 这使得数据库迁移对于任何Java EE应用程序都非常重要. 您是否还在执行应用程序时手动执行它们? 它仍然是一个锁定步骤过程,还是作为 ...
- Java EE中的配置管理
我尝试配置管理在云计算中具有很多相关性 争论 较早. 实际上,我大胆地宣称配置管理是任何认真尝试从软件中节省几美元的基石. 那么什么是配置管理及其主要目标? 在不使事情变得过于复杂的情况下,我认为接下 ...
- 在JAVA EE中配置hibernate以及hibernate hello world
为什么80%的码农都做不了架构师?>>> 这篇文章主要介绍hibernate的配置以及如何实现hello world.至于如何使用maven等工具获取到hibernate的ja ...
- Java EE中Ajax技术简单实现
一.Ajax技术介绍 Ajax实际上并不是新技术,而是几个老技术的融合. Ajax包含以下五个部分: 1.异步数据获取技术,使用XMLHttpRequest. 2.基于标准的表示技术,使用XHTML与 ...
- mongo java mapreduce_MongoDB中MapReduce介绍与使用
一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...
- java ee中javamail注解_JavaEE之注解
1注解:Annotation注解,是一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次,给计算机,JVM提供解读信息的. 2注解的作用:编译检查:代码分析,编 ...
- Java EE中的重新验证(java.util.regex.Pattern)
java.lang.Objectjava.util.regex.Pattern 所有已实现的接口: Serializable public final class Pattern extends Ob ...
最新文章
- PHP设计模式之装饰模式(Decorator)
- 阿里古谦:阿里互联网架构的6大最佳实践-博客-云栖社区-阿里云
- Mule ESB-3.Build a webservice proxy
- 基本概念—机器学习ML与深度学习DL
- Bada学习- C++以及Flash应用开发流程之创建应用工程
- Java字符类isUpperCase()方法与示例
- 敏捷武士:看敏捷高手交付卓越软件pdf
- 人类为什么没有尾巴?这个跳跃基因抹去了人类的尾巴,并带来了额外风险
- Mysql用户访问工作原理
- Docker 监控- Prometheus VS Cloud Insight
- Hadoop之倒排索引
- (转)基于.Net的单点登录(SSO)解决方案(1)
- 能打开QQ,但打开不了网页-网络热门故障排查
- 炫酷好玩好用的卫星全景地图
- ROS日记:ROS系统的备份和还原
- android 浮窗示例代码,Android 浮窗开发之窗口层级(示例代码)
- 持久内存指令(PMDK)简介
- 自定义notepad++ --添加插件SourceCookifier
- badatatable转成json_数据表转换成json(DatatableToJson)
- 为什么你看书记不住,记住不会用?-我的技术学习方法论
热门文章
- 【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果
- 蓝桥杯 试题 基础练习 特殊回文数——16行代码AC
- 大根堆的删除c语言,小根堆大根堆的动态创建与堆顶元素删除
- Linux上(Redhat7)实现NFS文件共享服务
- excel查标准正态分布_终于搞清楚正态分布、指数分布到底是个啥了
- php的通用变量,认识并使用PHP的全局变量
- cdn厂商 同兴万点_同兴万点:TXNetworks和CDNetworks让我们傻傻分不清
- python 非线性规划_自动驾驶运动规划-Hybird A*算法(续)
- 液晶弹性自由能计算_自由能方法应用(一)开放计算平台BRIDGE的介绍及使用案例...
- 关系代数的自然连接符号_初中数学知识清单之代数式的认识