002-原始jpa以及基本加载过程

一、概述

1.1、创建

    public void createMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        manager.persist(new Object());
        manager.getTransaction().commit();
        manager.close();
        factory.close();
    }

1.2、查询

    // 立即加载
    public void getMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        Object object = manager.find(Object.class, 1);
        System.out.println(object);// 如果Object是null,没有异常打印null
        manager.close();
        factory.close();
    }

    // 延迟加载
    public void getMethod2() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        // 延迟加载,不立即返回,返回一个代理对象,只有读取对象具体属性时,才返回具体对象
        Object object = manager.getReference(Object.class, 1);
        // 如果数据库没有object,在读取属性是出现异常
        // object.getName();
        manager.close();
        // 关闭后再读取有问题
        // object.getName();
        factory.close();
    }

1.3、更新

    public void updateMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        Object object = manager.find(Object.class, 1);
        object,setName("测试");
        manager.getTransaction().commit();
        manager.close();
        factory.close();
        // 四种 实体状态:new新建状态; managed托管状态,能够被更新【托管状态,被事务管理】,放到jdbc批处理中,commit之后开始提交;游离状态【托管】;删除状态
    }
    public void updateMethod2() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        Object object = manager.find(Object.class, 1);
        manager.clear();//把实体管理器中的所有实体变成游离状态,此时提交;不会被更新,需要做以下处理
        object,setName("测试");
        manager.merge(object);//把实体放入实体管理器中,再次提交可以被更新
        manager.getTransaction().commit();
        manager.close();
        factory.close();
        // 四种 实体状态:new新建状态; managed托管状态,能够被更新【托管状态,被事务管理】,放到jdbc批处理中,commit之后开始提交;游离状态【托管】;删除状态
    }

1.4、删除

    public void deleteMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        Object object = manager.find(Object.class, 1);
        manager.remove(object);
        manager.getTransaction().commit();
        manager.close();
        factory.close();
    }

二、基本加载过程

EntityManagerFactory factory = Persistence.createEntityManagerFactory("");

查看:Persistence,javax.persistence.Persistence,其中:createEntityManagerFactory代码如下

    public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
        EntityManagerFactory emf = null;
        List<PersistenceProvider> providers = getProviders();//1
        for ( PersistenceProvider provider : providers ) {
            emf = provider.createEntityManagerFactory( persistenceUnitName, properties );//2
            if ( emf != null ) {
                break;
            }
        }
        if ( emf == null ) {
            throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName );
        }
        return emf;
    }

对于1句,

    private static List<PersistenceProvider> getProviders() {
        return PersistenceProviderResolverHolder
                .getPersistenceProviderResolver()
                .getPersistenceProviders();
    }

查看代码,查看PersistenceProviderResolverHolder的私有静态类CachingPersistenceProviderResolver,其中读取

Enumeration<URL> resources = cl.getResources( "META-INF/services/" + PersistenceProvider.class.getName() );

对于第二句

provider.createEntityManagerFactory(

选择任意一个持久化接口创建

三、sql语句的使用【增删改查】

    public void sqlQueryMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        // 面向对象查询语句
        // 位置参数
        Query query = manager.createQuery("selet o from Person o where o.id=?1");
        query.setParameter(1, 222);
        // 类型参数
        // Query query2 = manager.createQuery("selet o from Person o where o.id=:id");
        // query2.setParameter("id", 222);

        List resultList = query.getResultList();

        //如果只有一个值
        //query.getSingleResult();
        manager.close();
        factory.close();
    }
    public void sqlDeleteMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        // 面向对象查询语句
        // 位置参数
        Query query = manager.createQuery("delete from Person o where o.id=?1");
        query.setParameter(1, 222);
        query.executeUpdate();
        manager.getTransaction().commit();
        manager.close();
        factory.close();
    }
    public void sqlUpdateMethod() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();// 开始事务
        // 面向对象查询语句
        // 位置参数
        Query query = manager.createQuery("update Person 0 set o.name=:name where  o.id=:id");
        query.setParameter("name", "zahangsan");
        query.setParameter("id", 11);
        query.executeUpdate();
        manager.getTransaction().commit();
        manager.close();
        factory.close();
    }

原文地址:https://www.cnblogs.com/bjlhx/p/9123916.html

时间: 2024-10-16 05:37:24

002-原始jpa以及基本加载过程的相关文章

看看Spring的源码——Bean加载过程

最近几天跟同事聊起Spring的一些问题,对一些地方有些疑问,趁这两天有点空,看看Spring的源码,了解下具体的实现细节.本文基于Spring 4.0.5版本. 首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的. <listener> <listener-class>org.springframework.web.context.ContextL

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作

construct2游戏的加载过程

一个Construct 2游戏的加载过程如下: 1. HTML页面和javascript脚本先被下载到本地,这时屏幕无任何显示. 2. 一旦javascript脚本下载完毕,默认的加载界面被显示出来. 3. 游戏的其他部分,主要是游戏中的图片(包括精灵.背景等)在显示默认的加载进度条的同时被下载到本地. 4. 最后,所有的内容下载完毕,准备开始游戏运行. 注意:游戏的声音并不在这四步里被下载到本地,而是在游戏开始后以流的方式导入.所以,在显示加载条的过程中,下载的其实都是图片,包括精灵.背景等等

Spring IOC bean加载过程

首先我们不要在学习Spring的开始产生畏难情绪.Spring没有臆想的那么高深,相反,它帮我们再项目开发中制定项目框架,简化项目开发.它的主要功能是将项目开发中繁琐的过程流程化,模式化,使用户仅在固定文件中增加特定标签并实现特定逻辑层的代码就能完成项目开发.下面我们来分析web项目启动时bean的初始化过程. 我们遵循类的依赖,引用关系来理清spring在这一过程中的架构和细节实现.java web项目入口在web.xml,Spring在此配置入口servlet完成bean的加载.Dispat

类本质的是? 类的加载过程?

类本质的东西 类也是一个对象: Person对象的类型是Class类型,Class里面包含了* 类本身也是对象,是个Class类型的对象:简称类对象: 利用Person类对象 创建Person类型的对象: 利用Class类型创建Person类对象: //获取内存中的类对象 Class c = [p class]; Class c2 = [p2 class]; 也可以用Person类来获取类对象: Class c3 = [Person Class]; 我们要查看p和p2的类对象,就是利用类方法cl

iOS之nib、xib及storyboard的区别及storyboard的加载过程

先讲述下nib, nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件: 区分xib和storyboard的区别? 不同点: 1> 无论nib也好,xib也好,最终在执行UIViewController生命周期函数loadView之前,都会转化成可执行的nib文件. 2> storyboard是多个xib文件集合的描述文件,一个xib文件对应着一个视图控制器和多个视图. toryboard时,一个工程只需要一个主storyboard文件就可以.

你所不知道的SQL Server数据库启动过程(用户数据库加载过程的疑难杂症)

前言 本篇主要是上一篇文章的补充篇,上一篇我们介绍了SQL Server服务启动过程所遇到的一些问题和解决方法,可点击查看,我们此篇主要介绍的是SQL Server启动过程中关于用户数据库加载的流程,并且根据加载过程中所遇到的一系列问题提供解决方案. 其实SQL Server作为微软的一款优秀RDBMS,它启动的过程中,本身所带的那些系统库发生问题的情况相对还是很少的,我们在平常使用中,出问题的大部分集中于我们自己建立的用户数据库. 而且,相对于侧重面而言,其实我们更关注的是我们自己建立的用户数

ThinkPHP3.2 加载过程(四)

前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线================================= 上次最后一个篇说道加载APP:run()   ----在ThinkPHP/Library/Think/Thinkclass.php下 在这里说明一下APP在什么时候会被定义并且加载的 配置文件ThinkPHP/Mode/common.

ThinkPHP3.2 加载过程(二)

原文:ThinkPHP3.2 加载过程(二) 回顾: 上次介绍了 ThinkPHP 的 Index.PHP入口文件.但只是TP的入口前面的入口(刷boss总是要过好几关才能让你看到 ,不然boss都没面子啊),从Index.PHP最后一行把我们引路到了TP的大门前(ThinkPHP/ThinkPHP.php) // 引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php'; 本次目标: 查看TP的大门,同时稍微探索一下大门内部的东西 正文: 先上代码 1