操作-持久化实体 ÷通过调用实体管理器的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 信息工程学院本科生课程 →→