JPA -加载_增多_更新_删除对象操作

JPA -------加载_增加_更新_删除对象操作

PersonTest.java

Java代码 JPA -加载_增多_更新_删除对象操作
  1. package junit.test;   
  2.   
  3. import javax.persistence.EntityManager;   
  4. import javax.persistence.EntityManagerFactory;   
  5. import javax.persistence.Persistence;   
  6.   
  7. import org.junit.BeforeClass;   
  8. import org.junit.Test;   
  9.   
  10. import cn.itcast.bean.Person;   
  11.   
  12. public class PersonTest {   
  13.   
  14.     @BeforeClass  
  15.     public static void setUpBeforeClass() throws Exception {   
  16.     }   
  17.   
  18.     @Test public void save(){   
  19.         //对实体bean进行操作,第一步应该获取什么对象啊?     SessionFactory对象。   
  20.         //这里用获取的EntityManagerFactory对象,这可以把它看成跟Hibernate的SessionFactory对象差不多的东西。   
  21.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  22.         EntityManager em = factory.createEntityManager();   
  23.         em.getTransaction().begin();//开启事务   
  24.         em.persist(new Person("中信软件"));   
  25.         em.getTransaction().commit();   
  26.         em.close();   
  27.         factory.close();   
  28.   
  29.         //SessionFactory  -->  Session  -->  begin事务   
  30.     }   
  31.     /*  
  32. session.save(obj);  
  33.     persist这方法在Hibernate里也存在,Hibernate的作者已经不太推荐大家用save方法,而是推荐大家用persist方法。  
  34.     why? 首先并不是代码上的问题,主要是这个名字上的问题,因为我们把这个ORM技术叫做持久化产品,那么我们对某个对象持久化,应该叫持久化,而不应该叫保存,所以后来Hibernate的作者推荐用persist方法,这并不是功能的问题,主要是取名的问题,所以用persist方法也可以。  
  35.      */  
  36.   
  37.     @Test public void getPerson(){   
  38.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  39.         EntityManager em = factory.createEntityManager();   
  40.         Person person = em.find(Person.class,1);    //相当于Hibernate的get方法,与load方法对应,不延迟加载。   
  41.         System.out.println(person.getName());   
  42.         em.close();   
  43.         factory.close();   
  44.     }   
  45.   
  46.     @Test public void getPerson2(){   
  47.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  48.         EntityManager em = factory.createEntityManager();   
  49.         Person person = em.getReference(Person.class,1);   
  50.         //相当于Hibernate的load方法,延迟加载。   
  51.         //并不会立刻从数据库里面得到这条记录,只是返回了一个代理对象。   
  52.         System.out.println(person.getName());   
  53.         //这时候才会去数据库里得数据,发生加载行为。   
  54.         //这时候要确保实体管理器处于打开状态。   
  55.         em.close();   
  56.         //System.out.println(person.getName()); 如果屏蔽上上句,在这里才访问属性,那就会出错,延迟加载需要EntityManager没关闭,实际是hibernate的session没关闭。   
  57.         factory.close();   
  58.     }   
  59.       
  60.     //jpa实体的四种状态:   
  61.     /*(1)new 新建状态。刚new出来的实体bean没有与任何EntityManager相关联就是新建状态。  
  62.       (2)managed 托管状态(与EntityManager相关联,被EntityManager托管),用EntityManager的find和getReference方法查找出来的对象就是一个托管状态bean。  
  63.       (3)游离状态。EntityManager对象调用clear方法,就把这个对象所托管的所有对象都变成游离状态的对象了。保存更改了处于游离状态的bean需要调用EntityManager对象的merge方法。  
  64.       (4)删除状态。*/  
  65.   
  66.     @Test public void updatePerson(){   //更改数据库里标志为1的那条记录的名字为老张,更改成功的两个条件:1、必须开启事务;2、这个bean对象处于托管状态。   
  67.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  68.         EntityManager em = factory.createEntityManager();   
  69.         em.getTransaction().begin(); //开启事务,只读取数据不需要开事务,更改数据的时候需要开事务。   
  70.         Person person=em.find(Person.class,1); //相当于Hibernate的get方法,第一个参数是实体Bean类(get方法采用泛型)(传什么类的class对象进去就返回什么类的对象回来),第二个参数是实体bean标识符的值(即ID的值,传入哪个id值返回的就是id为那个值的那条记录)。   
  71.         person.setName("老张");  //这个person是处于一个托管状态的bean对象,用set方法改变的属性并不会马上更新到数据库里面去,而是把这个操作放在一个jdbc的批处理里面,等到事务提交的时候才会更新到数据库里面去。   
  72.         em.getTransaction().commit();   
  73.         em.close();   
  74.         factory.close();   
  75.     }   
  76.   
  77.     @Test public void updatePerson2(){   
  78.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  79.         EntityManager em = factory.createEntityManager();   
  80.         em.getTransaction().begin();    //开启事务。   
  81.         Person person=em.find(Person.class,1);   
  82.         em.clear(); //把实体管理器中的所有实体变成游离状态。   
  83.         person.setName("老李");   
  84.         em.merge(person);    //更新处于游离状态的bean对象。   
  85.         em.getTransaction().commit();   
  86.         em.close();   
  87.         factory.close();   
  88.     }   
  89.   
  90.     @Test public void delete(){   
  91.         EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  92.         EntityManager em = factory.createEntityManager();   
  93.         em.getTransaction().begin();    //开启事务。   
  94.         Person person=em.find(Person.class,1);   
  95.         em.remove(person);    //删除的bean对象也必须是处于托管状态的对象才能被删除成功。否则,如果person不是托管状态的bean,也不会报错但数据库内的数据也不会删除。   
  96.         em.getTransaction().commit();   
  97.         em.close();   
  98.         factory.close();   
  99.     }   
  100.   
  101. }  
  102.  
  103. 我们目前使用的是Hibernate,实际上我们操纵EntityManager对象时,它内部是操纵了Hibernate里面的sesson对象。它内部只是对session对象做了个封装而已。

 

Java代码 JPA -加载_增多_更新_删除对象操作
  1.     @Test public void getPerson(){   
  2. EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  3. EntityManager em = factory.createEntityManager();   
  4. Person person = em.find(Person.class,2);    //相当于Hibernate的get方法。   
  5. System.out.println(person);   
  6. em.close();   
  7. factory.close();    

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

Java代码 JPA -加载_增多_更新_删除对象操作
  1. @Test public void getPerson2(){   
  2.     EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  3.     EntityManager em = factory.createEntityManager();   
  4.     Person person = em.getReference(Person.class,2);     //1   
  5.     System.out.println(person);                          //2   
  6.     em.close();   
  7.     factory.close();   
  8. }   



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

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

Java代码 JPA -加载_增多_更新_删除对象操作
  1. @Test public void updatePerson2(){   
  2.     EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast");   
  3.     EntityManager em = factory.createEntityManager();   
  4.     em.getTransaction().begin();//开启事务。   
  5.     Person person=em.find(Person.class,1);   
  6.     em.clear();  //把实体管理器中的所有实体变成游离状态。   
  7.     person.setName("老李");   
  8.     em.getTransaction().commit();   
  9.     em.close();   
  10.     factory.close();   
  11. }   

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