`
mzhj
  • 浏览: 228098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

07、使用JPA加载_更新_删除对象

阅读更多

 

PersonTest.java

package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.itcast.bean.Person;

public class PersonTest {

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test public void save(){
		//对实体bean进行操作,第一步应该获取什么对象啊?     SessionFactory对象。
		//这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差不多的东西。
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();//开启事务
		em.persist(new Person("传智播客"));
		em.getTransaction().commit();
		em.close();
		factory.close();

		//SessionFactory  -->  Session  -->  begin事务
	}
	/*
session.save(obj);
    persist这方法在Hibernate里也存在,Hibernate的作者已经不太推荐大家用save方法,而是推荐大家用persist方法。
    why? 首先并不是代码上的问题,主要是这个名字上的问题,因为我们把这个ORM技术叫做持久化产品,那么我们对某个对象持久化,应该叫持久化,而不应该叫保存,所以后来Hibernate的作者推荐用persist方法,这并不是功能的问题,主要是取名的问题,所以用persist方法也可以。
	 */

	@Test public void getPerson(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		Person person = em.find(Person.class,1);	//相当于Hibernate的get方法,与load方法对应,不延迟加载。
		System.out.println(person.getName());
		em.close();
		factory.close();
	}

	@Test public void getPerson2(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		Person person = em.getReference(Person.class,1);
        //相当于Hibernate的load方法,延迟加载。
		//并不会立刻从数据库里面得到这条记录,只是返回了一个代理对象。
		System.out.println(person.getName());
        //这时候才会去数据库里得数据,发生加载行为。
		//这时候要确保实体管理器处于打开状态。
		em.close();
		//System.out.println(person.getName()); 如果屏蔽上上句,在这里才访问属性,那就会出错,延迟加载需要EntityManager没关闭,实际是hibernate的session没关闭。
		factory.close();
	}
   
    //jpa实体的四种状态:
	/*(1)new 新建状态。刚new出来的实体bean没有与任何EntityManager相关联就是新建状态。
	  (2)managed 托管状态(与EntityManager相关联,被EntityManager托管),用EntityManager的find和getReference方法查找出来的对象就是一个托管状态bean。
	  (3)游离状态。EntityManager对象调用clear方法,就把这个对象所托管的所有对象都变成游离状态的对象了。保存更改了处于游离状态的bean需要调用EntityManager对象的merge方法。
	  (4)删除状态。*/

	@Test public void updatePerson(){   //更改数据库里标志为1的那条记录的名字为老张,更改成功的两个条件:1、必须开启事务;2、这个bean对象处于托管状态。
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin(); //开启事务,只读取数据不需要开事务,更改数据的时候需要开事务。
		Person person=em.find(Person.class,1); //相当于Hibernate的get方法,第一个参数是实体Bean类(get方法采用泛型)(传什么类的class对象进去就返回什么类的对象回来),第二个参数是实体bean标识符的值(即ID的值,传入哪个id值返回的就是id为那个值的那条记录)。
		person.setName("老张");  //这个person是处于一个托管状态的bean对象,用set方法改变的属性并不会马上更新到数据库里面去,而是把这个操作放在一个jdbc的批处理里面,等到事务提交的时候才会更新到数据库里面去。
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test public void updatePerson2(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	//开启事务。
		Person person=em.find(Person.class,1);
		em.clear();	//把实体管理器中的所有实体变成游离状态。
		person.setName("老黎");
		em.merge(person);    //更新处于游离状态的bean对象。
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test public void delete(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();	//开启事务。
		Person person=em.find(Person.class,1);
		em.remove(person);    //删除的bean对象也必须是处于托管状态的对象才能被删除成功。否则,如果person不是托管状态的bean,也不会报错但数据库内的数据也不会删除。
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

}

 

 



     我们目前使用的是Hibernate,实际上我们操纵EntityManager对象时,它内部是操纵了Hibernate里面的sesson对象。它内部只是对session对象做了个封装而已。

 

   	@Test public void getPerson(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		Person person = em.find(Person.class,2);	//相当于Hibernate的get方法。
		System.out.println(person);
		em.close();
		factory.close();
	}

 

如果不存在id为2的person的话,那么返回的是null值 。

	@Test public void getPerson2(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		Person person = em.getReference(Person.class,2);     //1
		System.out.println(person);                          //2
		em.close();
		factory.close();
	}

 



    如果不存在id为2的person的话,那么返回的是异常(javax.persistence.EntityNotFoundException)。
    异常是在什么时候触发的呢? 是在1?还是2呢?
    答案是2。这说明并不是em.getReference()这个方法执行时就发生异常,而是在你访问这个对象或是它属性的时候才出现异常。

    数据库里没有相应的记录,EntityManagerd对象的get方法获取不到记录会返回null,而EntityManagerd对象的getReference方法获取不到记录会在下一次访问这个返回值的时候抛出异常。 

	@Test public void updatePerson2(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();//开启事务。
		Person person=em.find(Person.class,1);
		em.clear();  //把实体管理器中的所有实体变成游离状态。
		person.setName("老黎");
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

 

    在clear之后,person变成了游离状态,这时候对游离状态的实体进行更新的话(person.setName("老黎");),更新的数据是不能同步到数据库的。可以采用方法em.merge(person);这方法是用于把在游离状态时候的更新同步到数据库。 

分享到:
评论

相关推荐

    07_传智播客JPA详解_使用JPA加载_更新_删除对象

    本课程"07_传智播客JPA详解_使用JPA加载_更新_删除对象"将深入讲解JPA在加载、更新和删除对象方面的应用。 首先,让我们了解一下JPA的基本概念。JPA通过实体类(Entity Class)来映射数据库表,实体类中的属性对应...

    07_JPA详解_使用JPA加载_更新_删除对象.zip

    本教程将深入讲解如何使用JPA进行对象的加载、更新和删除操作。 ### 1. JPA基本概念 #### 1.1 Entity(实体) 在JPA中,实体代表数据库中的表,通过在Java类上使用`@Entity`注解来标识。每个实体类对应一个数据库...

    JPA加载_更新_删除对象及使用JPQL语句进行查询

    本篇文章将深入探讨JPA中的对象加载、更新、删除操作以及如何使用JPQL(Java Persistence Query Language)进行查询,这些都是Java开发者在处理持久化层时不可或缺的知识点。 首先,我们来看JPA的对象加载。JPA提供...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准规范,它使得Java开发者能够以面向对象的方式处理数据库操作。本教程“11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护”聚焦于...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    本资料主要探讨的是JPA中的一对多关系以及延迟加载机制,这两部分是JPA使用中的关键概念。 **一对多关系** 在关系数据库中,一对多关系是最常见的一种关联类型。例如,一个部门可以有多名员工,而每个员工只能属于...

    09_JPA详解_使用JPQL语句进行查询.zip

    3. **CRUD操作**:创建(Create)、读取(Read)、更新(Update)和删除(Delete)是JPA的基本操作。使用`EntityManager`的`persist()`、`merge()`、`find()`、`remove()`方法可以完成这些操作。 4. **JPQL查询**:...

    01_传智播客JPA详解_全面阐释和精彩总结JPA

    2. **实体管理器(EntityManager)**:它是JPA的主要接口,负责管理实体的生命周期,如创建、查询、更新和删除。 3. **实体管理工厂(EntityManagerFactory)**:用于创建EntityManager实例,是线程安全的,一般在...

    01_JPA详解_全面阐释和精彩总结JPA.zip

    8. **实体监听器(EntityListeners)**:了解如何使用实体监听器进行实体生命周期事件的监听,如在插入、更新、删除时执行特定操作。 9. **性能优化**:分享如何优化JPA的性能,如批处理、延迟加载、缓存机制等,以...

    JPA.zip_JAVA 导出PDF_jpa api_jpa pdf

    实体管理器则负责与数据库进行交互,如保存、更新、删除实体以及执行查询。实体工厂是创建实体管理器的工厂类,而JPQL是一种类似于SQL的查询语言,用于在JPA中检索和操作实体。 在描述中提到的"ODP文件导出的PDF...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    在Java世界中,Java Persistence API(JPA)是用于管理和持久化对象的规范,它使得开发者可以方便地在关系数据库和面向对象的程序之间进行数据交互。本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    4. **Fetch策略**:默认情况下,JPA使用懒加载(Lazy Fetching)策略,这意味着关联的对象不会立即加载,只有在实际访问时才会查询数据库。如果需要立即加载关联,可以设置为急加载(Eager Fetching)。 5. **@...

    02_传智播客JPA详解_JPA开发环境和思想介绍

    JPA提供了一种对象/关系映射(ORM)机制,允许开发者以面向对象的方式处理数据,而无需直接编写SQL语句,简化了数据库操作。 本套“02_传智播客JPA详解_JPA开发环境和思想介绍”自学视频主要涵盖了以下几个关键知识...

    02_JPA详解_JPA开发环境和思想介绍.zip

    2. **元数据驱动**: JPA使用元数据(如注解或XML配置)来定义对象如何映射到数据库表,以及如何执行CRUD(创建、读取、更新、删除)操作。 3. **查询语言(JPQL)**: JPA提供了Java Persistence Query Language,...

    JPA文档_学TOPLINK必看_PDF格式

    实体管理器是JPA的主要接口,用于执行CRUD(创建、读取、更新、删除)操作。实体管理工厂则用于创建实体管理器实例,它是线程安全的,一般在整个应用程序生命周期中只创建一次。持久化上下文是JPA的一个重要特性,它...

    12_传智播客JPA详解_JPA中的一对一双向关联

    2. **懒加载与急加载**:JPA提供了懒加载和急加载策略来处理关联对象的加载。默认情况下,一对一关联是急加载,可以通过`@OneToOne(fetch = FetchType.LAZY)`设置为懒加载,以提高性能。 3. **数据一致性**:由于...

    14_JPA详解_JPA中的多对多双向关联的各项关系操作.zip

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于对象关系映射(ORM),它简化了数据库与Java应用程序之间的数据交互。在JPA中,多对多(Many-to-Many)关联是一种常见的关系类型,允许一个实体实例与...

    jpa_learn_01.zip

    1. **懒加载(Lazy Loading)**:默认情况下,JPA对关联实体执行懒加载,即关联的对象只在真正需要时才从数据库加载,有效防止了"大数据量"问题。 2. **级联操作(Cascading)**:通过`@CascadeType`,可以设置一个...

    jpa_hibernate项目 所有jar包

    JPA通过提供对象/关系映射(ORM)功能,使得开发者可以使用面向对象的方式来处理数据库操作。 **Hibernate**是JPA的一个实现,它是一个开源的ORM框架。Hibernate提供了更丰富的API,可以处理更复杂的数据操作,包括...

Global site tag (gtag.js) - Google Analytics