1、添加数据,代码如下:

@Test
public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // 开启事务
em.persist(new Person("hwl"));
em.getTransaction().commit();
em.close();
factory.close();
}

2、查询,代码如下:

(1)、第一种查找方式:

@Test
public void getPerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 第一个参数表示 实体类 第二个参数表示 实体标识符
Person person = em.find(Person.class, 1);
System.out.println(person.getName());
em.close();
factory.close();
}

(2)、第二种查找方式:

@Test
public void getPerson2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 第一个参数表示 实体类 第二个参数表示 实体标识符
// 调用这个方法时,并不会立即从数据库中得到数据,只是返回一个代理对象
Person person = em.getReference(Person.class, 1);
// 当我们对代理对象的属性进行访问的时候,才会从数据库中获取数据
// 如果执行以上方法,数据库中没有对应的数据,是不会报错的,会在执行 person.getName() 时才异常
System.out.println(person.getName());
em.close();
factory.close();
}

调用 getReference() 方法时,不会立刻从数据库中读取数据,只是返回一个代理对象,只有代理对象调用属性的 getXX() 方法时才会从数据库中获取数据。

3、修改,代码如下:

(1)、第一种情况:

@Test
public void updatePerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 实体管理器已于事务关联
em.getTransaction().begin();
// 查找出来后 person 对象在 CPU 时处于托管状态
// 这时调用实体类的 set 方法,可以对数据进行更改,但并不是立即更改,是放在 JDBC 的批处理交易库里面
Person person = em.find(Person.class, 1);
person.setName("zxx");
// 调用事务提交后,会将数据同步到数据库中
em.getTransaction().commit();
em.close();
factory.close(); // 实体在 CPU 中有四种状态
//第一种 新建(new) 第二种 托管(manage) 第三种 游离 第四种 删除
}

首先,实体管理器要与事务关联;查询出来的实体对象在 CPU 中处于托管状态,实体对象调用属性的 setXX() 对数据进行更改;提交事务后,会将数据同步到数据库中。

(2)、第二种情况:

@Test
public void updatePerson2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); // 将实体管理器中的所有实体状态变成游离状态
person.setName("zxx");
em.merge(person); // 将游离状态的数据更新同步到数据库
em.getTransaction().commit();
em.close();
factory.close();
}

调用 clear() 方法,将实体管理器中的所有实体状态变成游离状态

调用 merge() 方法,将游离状态的数据更新同步到数据库

4、删除,代码如下:

@Test
public void delete(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
}

5、详细代码:

package learn.jpa.junit.test;

import static org.junit.Assert.*;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence; import learn.jpa.bean.Person; import org.junit.Test; public class PersonTest { @Test
public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin(); // 开启事务
em.persist(new Person("hwl"));
em.getTransaction().commit();
em.close();
factory.close();
} /**
* 查询
*/
@Test
public void getPerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 第一个参数表示 实体类 第二个参数表示 实体标识符
Person person = em.find(Person.class, 1);
System.out.println(person.getName());
em.close();
factory.close();
} @Test
public void getPerson2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 第一个参数表示 实体类 第二个参数表示 实体标识符
// 调用这个方法时,并不会立即从数据库中得到数据,只是返回一个代理对象
Person person = em.getReference(Person.class, 1);
// 当我们对代理对象的属性进行访问的时候,才会从数据库中获取数据
// 如果执行以上方法,数据库中没有对应的数据,是不会报错的,会在执行 person.getName() 时才异常
System.out.println(person.getName());
em.close();
factory.close();
} @Test
public void updatePerson(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
// 实体管理器已于事务关联
em.getTransaction().begin();
// 查找出来后 person 对象在 CPU 时处于托管状态
// 这时调用实体类的 set 方法,可以对数据进行更改,但并不是立即更改,是放在 JDBC 的批处理交易库里面
Person person = em.find(Person.class, 1);
person.setName("zxx");
// 调用事务提交后,会将数据同步到数据库中
em.getTransaction().commit();
em.close();
factory.close(); // 实体在 CPU 中有四种状态
//第一种 新建(new) 第二种 托管(manage) 第三种 游离 第四种 删除
} @Test
public void updatePerson2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); // 将实体管理器中的所有实体状态变成游离状态
person.setName("zxx");
em.merge(person); // 将游离状态的数据更新同步到数据库
em.getTransaction().commit();
em.close();
factory.close();
} @Test
public void delete(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("learn_jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person);
em.getTransaction().commit();
em.close();
factory.close();
}
}

JPA学习---第七节:使用JPA加载_更新_删除对象的更多相关文章

  1. pgloader 学习(七) 从归档文件加载数据

    我们可以直接从zip,tar,gzip 文件获取内容 command file 参考格式 LOAD ARCHIVE FROM /Users/dim/Downloads/GeoLiteCity-late ...

  2. JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作

    1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; i ...

  3. JPA学习---第十节:JPA中的一对一双向关联

    1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.pe ...

  4. JPA学习---第四节:JPA实例与JPA主键生成策略

    1.编写实体类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.Gene ...

  5. JPA学习---第三节:搭建JPA开发环境和全局事务介绍

    一.创建 Java 项目 1.导入所需的 jar 包: 2.创建 persistence.xml 文件, 代码如下: <?xml version="1.0" encoding ...

  6. Yaf零基础学习总结5-Yaf类的自动加载

    Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...

  7. Spring5.0源码学习系列之浅谈懒加载机制原理

    前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...

  8. ajax 实现页面加载和内容的删除

    ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快,  下面是用ajax以数据库fruit表为例写的 ...

  9. java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

    java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...

随机推荐

  1. C#读取shp的属性信息

    一个完整的ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表文件.主文件是一个直接存取,变记录长度文件,其中每个记录描述一 个由其顶点列表组成的shape.在索引文件中,每条记录 ...

  2. OpenFlow概述

    OpenFlow名称里面虽然包括“Flow”,但其并不是“又一个流程引擎”,我们认为世界上的流程引擎已经足够多了,每个流程引擎都各有千秋,有的甚至免费,所以我们不需要再做一个流程引擎,我们做OpenF ...

  3. OpenShare新功能@2014年第三季度

    新功能@2014第三季度 新增"多租户"的支持:巨型企业集团的私有云需要多租户模式,现在OpenShare可以从根本上完美支持 租户之间完全隔离,这是最高安全性 同时每个租户可以使 ...

  4. 每天一道LeetCode--434. Number of Segments in a String

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  5. 慎用memset();

    <span style="font-family: Arial, Helvetica, sans-serif;">void *(memset) (void *s,int ...

  6. linux中Apache更Nginx环境配置教程

    想把Apache2.2换Nginx已经有些日子,今天给动手了.找了个稳定版本:1.4.1  http://nginx.org/download/nginx-1.4.1.zip 配置很简单,就是ngin ...

  7. [转]Mac OS X 下部分Android手机无法连接adb问题之解决方案

    时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说了,总之做的 ...

  8. dateset是不是在缓存中

    C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...

  9. JCrop+ajaxUpload 图像切割上传

    先看效果 需要的文件下载 链接:http://pan.baidu.com/s/1b8SI6M 密码:59ct 页面代码 里面用户的uuid是写死的test <%@ page language=& ...

  10. document.write() 和 document.writeln() 区别

    写javascript页面时,看到这两个函数,第一感觉应该是一个换行,一个不换行, 但是实际使用时是一样的(writeln()函数在浏览器页面会多一个空格而不是换行). 简单搜索查阅了下: 查看源 d ...