JPA学习---第七节:使用JPA加载_更新_删除对象

时间:2023-03-08 23:09:41
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();
}
}