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();
    }
}
时间: 2024-12-26 08:28:37

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

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

1.定义实体类,代码如下: (1).学生实体类: package learn.jpa.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import

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

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

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

1.编写实体类,代码如下: package learn.jpa.bean; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class Person { @Id @GeneratedValue private Integer id; private String name; public Person(){}

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

一.创建 Java 项目 1.导入所需的 jar 包: 2.创建 persistence.xml 文件, 代码如下: <?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"    xmlns="http://java.sun.com/xml/ns/persistence"     xmlns:xsi="http://www.w

Rhythmk 学习 Hibernate 03 - Hibernate 之 延时加载 以及 ID 生成策略

Hibernate 加载数据 有get,跟Load 1.懒加载: 使用session.load(type,id)获取对象,并不读取数据库,只有在使用返回对象值才正真去查询数据库. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 @Test    public void  test1()    {        Session session = null;         try {             session = Hiber

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

Yaf零基础学习总结5-Yaf类的自动加载 框架的一个重要功能就是类的自动加载了,在第一个demo的时候我们就约定自己的项目的目录结构,框架就基于这个目录结构来自动加载需要的类文件. Yaf在自启动的时候, 会通过SPL注册一个自己的Autoloader, 出于性能的考虑, 对于框架相关的MVC类, Yaf Autoloader只以目录映射的方式尝试一次. 具体的目录映射规则如下: 对于控制器 Controller 默认模块下为{项目路径}/controllers/, 否则为{项目路径}/mod

第一节:程序集加载

我们知道JIT编译器将方法的IL代码编译成本地代码时,会查看IL代码中引用了哪些类型.在运行时,JIT编译器利用程序集的TypeRef和AssemblyRef元数据表来确定哪一个程序集定义了所引用的类型.在AssemblyRef元数据表的记录项中,包含了构成程序集强名称的各个部分.JIT编译器获取所有这些部分,包括名称(无扩展名和路径).版本.语言文化和公钥标记,并把它连接成一个字符串.然后,JIT编译器尝试将与该标识匹配的一个程序集加载到AppDomain中(如果还没有加载的话).如果被加载的

Echarts--异步数据加载和更新

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>异步数据加载和更新</title> </head> <body> <div id="main" style="width:800px;height:600px;"></div&

整合了刷新、加载更多、滑动删除功能的XListview

转载请说明出处:http://blog.csdn.net/bz419927089 如果想做带有刷新.加载更多功能的listview,我们可以使用XListview.(已经停止维护,github地址:https://github.com/Maxwin-z/XListView-Android) 如果想做带有滑动删除功能的listview,我们可以使用SwipeListview.(github地址:https://github.com/47deg/android-swipelistview) 如果想做