本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接
总文档 :文章目录
Github : github.com/black-ant
一 . 前言
JPA 使用过程中 , 经常会出现解析的异常 ,通过以下流程 , 有利于找到对应的节点
1.1 前置知识点
EntityManager
EntityManager 实例与持久性上下文关联。
持久性上下文是一组实体实例,其中对于任何持久性实体标识,都存在唯一的实体实例。在持久化上下文中,管理实体实例及其生命周期。EntityManager API 用于创建和删除持久性实体实例,根据实体的主键查找实体,以及查询实体。
persistent 简介
persistent 是持久化上下文 , 用于将事务持久化
持久性上下文处理一组实体,这些实体包含要在某个持久性存储中持久化的数据(例如数据库)。特别是,上下文知道一个实体在上下文和底层持久性存储方面可能具有的不同状态(例如托管、分离)。
persistent 功能
- 持久性上下文通常通过 EntityManager 访问
- 每个EntityManager实例都与一个持久化上下文相关联。
- 在持久化上下文中,管理实体实例及其生命周期。
- 持久化上下文定义了一个作用域,特定实体实例在这个作用域下被创建、持久化和删除。
- 持久化上下文类似于包含一组持久化实体的缓存,因此一旦事务完成,所有持久化对象都将从EntityManager的持久化上下文中分离出来,不再进行管理。
persistent 的分类
- Transaction-scoped persistence context
- Extended-scoped persistence context
二 . 逻辑流程
2.1 SQL 解析主流程
主流程可以分为几个部分 :
Execute Action 入口流程
// Step 1 : ExecutableList 处理
C51- ActionQueue
F51_01- LinkedHashMap<Class<? extends Executable>,ListProvider>
M51_01- executeActions() : 执行所有当前排队的操作
FOR- 循环所有的 ListProvider
- 通过当前 ListProvider 获取 ExecutableList , 调用 M51_02
M51_02- executeActions(ExecutableList<E> list)
FOR- 循环list , 调用 ExecutableList.execute() -> M52_01
// Step 2 : Entity 实体类的处理
C52- EntityInsertAction
M52_01- execute()
// Step 1 : 参数准备
- EntityPersister persister = getPersister();
- SharedSessionContractImplementor session = getSession();
- Object instance = getInstance();
- Serializable id = getId();
// Step 2 : 执行 insert 流程
- persister.insert( id, getState(), instance, session ) -> M53_01
// Step 3 : insert 操作的执行
- PersistenceContext persistenceContext = session.getPersistenceContext();
- EntityEntry entry = persistenceContext.getEntry( instance )
- entry.postInsert( getState() )
//........ 后续操作在操作流程中再详细看
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐