JPA学习---第七节:使用JPA加载_更新_删除对象
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加载_更新_删除对象的更多相关文章
- pgloader 学习(七) 从归档文件加载数据
我们可以直接从zip,tar,gzip 文件获取内容 command file 参考格式 LOAD ARCHIVE FROM /Users/dim/Downloads/GeoLiteCity-late ...
- JPA学习---第十一节:JPA中的多对多双向关联实体定义与注解设置及操作
1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; i ...
- JPA学习---第十节:JPA中的一对一双向关联
1.创建实体类,代码如下: 代码清单1: package learn.jpa.entity; import javax.persistence.CascadeType; import javax.pe ...
- JPA学习---第四节:JPA实例与JPA主键生成策略
1.编写实体类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.Gene ...
- JPA学习---第三节:搭建JPA开发环境和全局事务介绍
一.创建 Java 项目 1.导入所需的 jar 包: 2.创建 persistence.xml 文件, 代码如下: <?xml version="1.0" encoding ...
- Yaf零基础学习总结5-Yaf类的自动加载
Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的 ...
- Spring5.0源码学习系列之浅谈懒加载机制原理
前言介绍 附录:Spring源码学习专栏 在上一章的学习中,我们对Bean的创建有了一个粗略的了解,接着本文挑一个比较重要的知识点Bean的懒加载进行学习 1.什么是懒加载? 懒加载(Lazy-ini ...
- ajax 实现页面加载和内容的删除
ajax最大的好处就在于加载和删除的时候不会跳转页面,现在的网页大多都会选择用ajax来写,相比嵌入PHP代码来说减少了代码量,同时加载页面也会比较快, 下面是用ajax以数据库fruit表为例写的 ...
- java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象
java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...
随机推荐
- C#读取shp的属性信息
一个完整的ESRI的shape文件包括一个主文件,一个索引文件,和一个dBASE表文件.主文件是一个直接存取,变记录长度文件,其中每个记录描述一 个由其顶点列表组成的shape.在索引文件中,每条记录 ...
- OpenFlow概述
OpenFlow名称里面虽然包括“Flow”,但其并不是“又一个流程引擎”,我们认为世界上的流程引擎已经足够多了,每个流程引擎都各有千秋,有的甚至免费,所以我们不需要再做一个流程引擎,我们做OpenF ...
- OpenShare新功能@2014年第三季度
新功能@2014第三季度 新增"多租户"的支持:巨型企业集团的私有云需要多租户模式,现在OpenShare可以从根本上完美支持 租户之间完全隔离,这是最高安全性 同时每个租户可以使 ...
- 每天一道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 ...
- 慎用memset();
<span style="font-family: Arial, Helvetica, sans-serif;">void *(memset) (void *s,int ...
- linux中Apache更Nginx环境配置教程
想把Apache2.2换Nginx已经有些日子,今天给动手了.找了个稳定版本:1.4.1 http://nginx.org/download/nginx-1.4.1.zip 配置很简单,就是ngin ...
- [转]Mac OS X 下部分Android手机无法连接adb问题之解决方案
时至当今,Android山寨手机厂商已如此之多,能修改和个性化定制Android OS的能人已是多如牛毛,有的牛人修改Android系统只会影响所修改的点,不会影响其它,然后还有的就不多说了,总之做的 ...
- dateset是不是在缓存中
C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...
- JCrop+ajaxUpload 图像切割上传
先看效果 需要的文件下载 链接:http://pan.baidu.com/s/1b8SI6M 密码:59ct 页面代码 里面用户的uuid是写死的test <%@ page language=& ...
- document.write() 和 document.writeln() 区别
写javascript页面时,看到这两个函数,第一感觉应该是一个换行,一个不换行, 但是实际使用时是一样的(writeln()函数在浏览器页面会多一个空格而不是换行). 简单搜索查阅了下: 查看源 d ...