课程提纲 口第一部分Java EE基础 口第二部分Java Web:开发 口第三部分JSF框架 口第四部分EJB ◆第13章JPA进阶 JPQL (Java Persistence Query Language) 口第五部分JPA 口第六部分SSH框架 Java EE技术 ·1。西北农林科大学信息工程学院本科生课程
课程提纲 第一部分 Java EE基础 第二部分 Java Web开发 第三部分 JSF框架 第四部分 EJB ◆第13章 JPA进阶 JPQL (Java Persistence Query Language) 第五部分 JPA 第六部分 SSH框架 Java EE技术 •1 信息工程学院本科生课程
主要内容 冬实体的状态及操作: 实体主键与实体属性: 。主键生成策略,复合主键,嵌入式主键 实体属性:类型、加载方式等 实体关系映射: 。关联关系:一对一、一对多与多对一、 多对多 继承关系: JPA查询语言(JPA QL): ·使用查询对象完成查询 ·处理查询结果 。 使用标准$QL语句 ·条件查询、关系查询等 JPA进阶 ·2。西北农林升技大学信息工程学院本科生课程
❖ 实体的状态及操作: ❖ 实体主键与实体属性: • 主键生成策略,复合主键,嵌入式主键 • 实体属性:类型、加载方式等 ❖ 实体关系映射: • 关联关系:一对一、一对多与多对一、多对多 • 继承关系: ❖ JPA查询语言 (JPA QL): • 使用查询对象完成查询 • 处理查询结果 • 使用标准SQL语句 • 条件查询、关系查询等 JPA进阶 •2 信息工程学院本科生课程 主要内容
实体的状态转换 PC:PersisteneContext does not exist POJO construction Objectobj new Objecto; 1.Database remove 与PG还未关联 2.@PostRemove new 1.EntityManager.persist(obj) 2.@PrePersist 3.Database insert 4.@PostPersist commit(/rollback0/close 0 1.EntityManager.remove(obj) serialized to another tier 与PC电关联 2.@PreRemove detached managed 3.Pending removal in database removed 与PC不再关联 EntityManager.merge(obj) 与PC有关联, 1.Update query 但即将被删除 1.EntityManager.refresh(obj) 2.@PreUpdate 2.@Post扎nad 3.Database update 4.@PostUpdate JPA进阶 3。 西北农林科教大学信息工程学院本科生课程
实体的状态转换 •3 信息工程学院本科生课程 与PC还未关联 与PC已关联 与PC不再关联 与PC有关联, 但即将被删除 commit()/rollback()/close() PC: PersisteneContext JPA进阶
实体的状态 冬新建状态(new):尚未与实体管理器关联过的实体 ·新建状态的实体不会被持久化到数据库中; ·通过实体管理器的persist'可将其持久化而成为受管的; ·如新建实体没有被引用,垃圾回收机制将回收。 受管状态(managed):数据库中存在对应的记录、 拥有持久化标识、处于实体管理器管理之下的实体 ·受管状态下的实体可能是刚保存的,或是刚被加载的; ·JPA会自动检测到处于受管状态下的实体的改动。当程序 修改受管实体的属性时,JPA负责修改,开发者无需手工 执行JPDATE语句。 JPA进阶 ·4。品北农林升教大学信息工程学院本科生课程
❖ 新建状态(new):尚未与实体管理器关联过的实体 • 新建状态的实体不会被持久化到数据库中; • 通过实体管理器的persist可将其持久化而成为受管的; • 如新建实体没有被引用,垃圾回收机制将回收。 ❖ 受管状态(managed):数据库中存在对应的记录、 拥有持久化标识、处于实体管理器管理之下的实体 • 受管状态下的实体可能是刚保存的,或是刚被加载的; • JPA会自动检测到处于受管状态下的实体的改动。当程序 修改受管实体的属性时,JPA负责修改,开发者无需手工 执行UPDATE语句。 实体的状态 JPA进阶 •4 信息工程学院本科生课程
实体的状态 分离状态(detached):具有持久化标识,但已与实 体管理器失去关联的实体 ·处于分离状态实体的引用依然有效,可继续被修改; ·这里的分离是指该实体“脱离”了实体管理器的管理。 被删除状态(r emoved):具有持久化标识、与上下 文仍然关联、待从数据库中删除的实体 。当实体管理器调用remove()方法删除指定实体之后,该 实体将进入被删除状态; 当其对应的记录将从数据库中删除且调用@PostRemove方 法后,实体将被回收。 JPA进阶 ·5。品北农林科大学信息工程学院本科生课程
❖ 分离状态(detached):具有持久化标识,但已与实 体管理器失去关联的实体 • 处于分离状态实体的引用依然有效,可继续被修改; • 这里的分离是指该实体“脱离”了实体管理器的管理。 ❖ 被删除状态(removed):具有持久化标识、与上下 文仍然关联、待从数据库中删除的实体 • 当实体管理器调用remove()方法删除指定实体之后,该 实体将进入被删除状态; • 当其对应的记录将从数据库中删除且调用@PostRemove方 法后,实体将被回收。 实体的状态 JPA进阶 •5 信息工程学院本科生课程
操作-持久化实体 ÷通过调用实体管理器的persist0方法可以使一个 新创建的实体实例变为受管的: 。·如X是一个新创建实体,将变成受管的。在事务提交后, X会被写到数据库中; ·如X是一个受管实体,持久操作将被忽略。但所关联的 实体可能会受到该操作影响。如X与其关联实体间的关 系使用cascade=PERSIST:或者cascade=ALL注解,意味着 持久操作将会持久所关联的实体。如在持久化订单时会 持久所涉及的订单项; 。 如果X是一个分离的对象,当调用persist()操作时,将 抛出EntityExistsException.。在调用flush()或者 commit()方法时产生类似的异常。 JPA进阶 ·6。西北农林升教大学信息工程学院本科生课程
❖ 通过调用实体管理器的persist()方法可以使一个 新创建的实体实例变为受管的: • 如X是一个新创建实体,将变成受管的。在事务提交后, X会被写到数据库中; • 如X是一个受管实体,持久操作将被忽略。但所关联的 实体可能会受到该操作影响。如X与其关联实体间的关 系使用cascade=PERSIST或者cascade=ALL注解,意味着 持久操作将会持久所关联的实体。如在持久化订单时会 持久所涉及的订单项; • 如果X是一个分离的对象,当调用persist()操作时,将 抛出EntityExistsException。在调用flush()或者 commit()方法时产生类似的异常。 操作 - 持久化实体 JPA进阶 •6 信息工程学院本科生课程 →→
操作-删除实体 通过调用实体管理器的remove()方法,受管实体 实例可以变为被删除的: ·如X是一个新建实体,该操作将被忽略,但其所关联实 体可能会受该操作影响; 。1 如果X是一个受管的实体实例,删除操作使得这个实体 实例所处的状态变成被删除状态; 。 如果关联关系标注为cascade=REMOVE或cascade=ALL, 删除操作会被级联到该实体所关联的实体; ·如X是一个分离实体,调用该操作时将抛出异常; 。如X是一处于删除状态的实体,remove操作将被忽略; 在事务被提交时,被删除的实体X将被从数据库中删除。 JPA进阶 ●7. 西北农林科教大学信息工程学院本科生课程
❖ 通过调用实体管理器的remove()方法,受管实体 实例可以变为被删除的: • 如X是一个新建实体,该操作将被忽略,但其所关联实 体可能会受该操作影响; • 如果X是一个受管的实体实例,删除操作使得这个实体 实例所处的状态变成被删除状态; • 如果关联关系标注为cascade=REMOVE或cascade=ALL, 删除操作会被级联到该实体所关联的实体; • 如X是一个分离实体,调用该操作时将抛出异常; • 如X是一处于删除状态的实体,remove操作将被忽略; • 在事务被提交时,被删除的实体X将被从数据库中删除。 操作 - 删除实体 JPA进阶 •7 信息工程学院本科生课程 →→
操作-分离实体/合并实体 。分离实体可来自:事务提交/回滚、删除持久上下 文、关闭实体管理器等。分离实体处于持久上下文 环境之外,其状态不再被保证与数据库中的一致; 合并操作把分离实体的状态传递给实体管理器所管 理的持久实体。如合并的是删除的实体,将抛出异 常。如合并的是受管实体,则合并操作会被忽略, 但其所关联的实体可能会受到影响。 Web(presentation)tier Persistence context Detached Entity merge() Managed Entity State synchronization Database JPA进阶 8 西北农林秤技大学信息工程学院本科生课程
❖ 分离实体可来自:事务提交/回滚、删除持久上下 文、关闭实体管理器等。分离实体处于持久上下文 环境之外,其状态不再被保证与数据库中的一致; ❖ 合并操作把分离实体的状态传递给实体管理器所管 理的持久实体。如合并的是删除的实体,将抛出异 常。如合并的是受管实体,则合并操作会被忽略, 但其所关联的实体可能会受到影响。 操作 – 分离实体/ 合并实体 JPA进阶 •8 信息工程学院本科生课程 →→
操作-同步数据库/刷新实体 调用persist(/merge()/remove (方法时,实体 更新并未立即体现到DB中。flush()方法将实体更 新保存到DB。可通过调用setF IushMode)方法设 定flush方式(自动或事务提交时); 调用refresh方法来刷新该实体,即将DB中对应 的记录加载到该实体; 方法flush()和refresh)一般为实体管理器在进 行自动管理时调用,很少需要在程序中显式调用。 这两个方法的作用方向相反,如下图所示: flush() 实体 数据库 refresh() JPA进阶 ●9. 西北农林科教大学信息工程学院本科生课程
❖ 调用persist()/merge()/remove()方法时,实体 更新并未立即体现到DB中。flush()方法将实体更 新保存到DB。可通过调用setFlushMode()方法设 定flush方式(自动或事务提交时); ❖ 调用refresh()方法来刷新该实体,即将DB中对应 的记录加载到该实体; ❖ 方法flush()和refresh()一般为实体管理器在进 行自动管理时调用,很少需要在程序中显式调用。 这两个方法的作用方向相反,如下图所示: 操作 - 同步数据库 / 刷新实体 实体 数据库 refresh() flush() JPA进阶 •9 信息工程学院本科生课程 →→
操作-管理实体 ”应用需保证实例只在一个持久上下文中被管理。 contains0方法可用于确定实体实例是否被当前 持久化上下文管理: ·contains)方法返回true的情形是: √实体已经被从数据库中检索到,且未被删除和分离; √实体实例是新建的,已使用persist0方法,或已被 级联到persist操作。 ·contains()方法返回false的情形是: √实例是分离的; √对该实体调用或已被级联了remove (方法; √新建实例,且还未被调用persist0或未级联 persist()方法。 JPA进阶 10 品北农林升教大学信息工程学院本科生课程
❖ 应用需保证实例只在一个持久上下文中被管理。 contains()方法可用于确定实体实例是否被当前 持久化上下文管理: • contains()方法返回true的情形是: ✓实体已经被从数据库中检索到,且未被删除和分离; ✓实体实例是新建的,已使用persist()方法,或已被 级联到persist操作。 • contains()方法返回false的情形是: ✓实例是分离的; ✓对该实体调用或已被级联了remove()方法; ✓新建实例,且还未被调用persist()或未级联 persist()方法。 操作 – 管理实体 JPA进阶 •10 信息工程学院本科生课程 →→