JPA(Java Persistence API)学习五(实体和表CRUD功能)

1.示例(查询)--要找到一个实体,EntityManger接口提供了find()方法,该方法根据主键搜索一个元素。

   EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");

   EntityManager em = emf.createEntityManager();
   //默认是主键查询
   StudentEntity s = em.find(StudentEntity.class, 1001);
   System.out.println("Student id = " + s.getS_id());
   System.out.println("Student Name = " + s.getS_name());
   System.out.println("Student Age = " + s.getS_age());

   

2.示例(更新set)

   概述:当实体正在被容器管理时,你可以调用实体的set方法对数据进行修改,

             在容器决定flush时(这个由Container自行判断),更新的数据 才会同步到数据库,

             而不是在调用了set方法对数据进行修改后马上同步到数据库。

              如果你希望修改后的数据马上同步到数据库,你可以调用 EntityManager.flush()方法。

    代码:

      EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");

      EntityManager em = emf.createEntityManager();

 

      StudentEntity s = em.find(StudentEntity.class, 1001);
      System.out.println("Before Updation");
      System.out.println("Student id = " + s.getS_id());
      System.out.println("Student Name = " + s.getS_name());
      System.out.println("Student Age = " + s.getS_age());
 
      s.setS_age(30);//重点,这里执行完之后数据库相应的也做了跟新

 

      System.out.println("After Updation");
      System.out.println("Student id = " + s.getS_id());
      System.out.println("Student Name = " + s.getS_name());
      System.out.println("Student Age = " + s.getS_age());
 
3.示例(更新merge)
    概述:在实体Bean已经脱离了EntityManager的管理时,
              你调用实体的set方法对数据进行修改是无法同步更改到数据库的。
              你必须调用 EntityManager.merge()方法。
              调用之后,在容器决定flush时(这个由container自行判断),
              更新的数据才会同步到数据库。
              如果你希望修改后的数据马上同步到数据库,
              你可以调用EntityManager.flush()方法。
    代碼:
         public boolean updatePerson(Person person) {
            try {
                //这之前没有做查询操作,应该说的就是脱离了管理
                em.merge(person);
            } catch (Exception e) {
                e.printStackTrace();
                 return false;
           }
               return true;
          }
     具体分析:
        PersonDAO persondao = (PersonDAO) ctx.lookup("PersonDAOBean/remote");
        Person person = persondao.getPersonByID(1); //此时的person 已经脱离容器的管理
        person.setName("张小艳");
        persondao.updatePerson(person);
        分析:
           第二行代码把实体Bean 返回到了客户端,
           这时的实体Bean已经脱离了容器的管理,
           在客户端对实体Bean进行修改,
           最后把他返回给EJB 容器进行更新操作 
           
 
4.执行em.merge(person)方法时,容器的工作规则
   第一点:  如果此时容器中已经存在一个受容器管理的具有相同ID的person实例,
                容器将会把参数person的内容拷贝进这个受管理的实例,
                merge()方法 返回受管理的实例,但参数person仍然是分离的不受管理的。
                容器在决定Flush时把实例同步到数据库中。
   第二点:容器中不存在具有相同ID的person实例。
                容器根据传进的person参数Copy出一个受容器管理的person实例,
                同时 merge()方法会返回出这个受管理的实例,但参数person仍然是分离的不受管理的。
                容器在决定Flush时把实例同步到数据库中。
    注:如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException。
    
 
5.merge的作用
   新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:

   当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert。

   当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,发出update语句;

   如果没有设置ID的话,则这个对象就当作瞬态处理:

   用update的话,由于没有ID,所以会报异常,merge此时则会保存数据,根据ID生产策略生成一条数据;

 

6.删除

  概述:要从数据库中删除记录,可以使用EntityManager接口提供remove()方法。
             remove()方法使用主键来删除特定的记录

  代码:
       EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");
       EntityManager em = emf.createEntityManager();
       em.getTransaction().begin();
   
       StudentEntity s = em.find(StudentEntity.class, 1001);
       em.remove(s);
       em.getTransaction().commit();
       em.close();
       emf.close();
  注:CRUD做这些操作不是马上执行,调用EntityManager.flush()才会做映射到数据库的操作,
         所以上述的视为批量操作,可以在循环添加后,再执行flush()方法
 
 

 

学习来源:https://blog.csdn.net/asdfsadfasdfsa/article/details/79452521

                 https://www.yiibai.com/jpa/jpa-collection-mapping.html#article-start

posted @ 2020-09-08 10:10  小窝蜗  阅读(184)  评论(0)    收藏  举报