day02_Hibernate

1. 对象的状态-2

1.1 session.clean( )

   
   
   
   
  1. /**
  2. * session.clear方法把所有的对象从session中清空
  3. */
  4. @Test
  5. public void testClear(){
  6. Session session = sessionFactory.openSession();
  7. Transaction transaction = session.beginTransaction();
  8. Person person = (Person)session.get(Person.class, 1L);
  9. person.setPname("asd");
  10. session.clear();//把session中所有的对象清空
  11. session.update(person);//把对象从脱管状态转化成持久化状态
  12. transaction.commit();
  13. session.close();
  14. }

1.2 session.evict( )

    
    
    
    
  1. /**
  2. * session.evict把一个对象从session中清空
  3. */
  4. @Test
  5. public void testEvict(){
  6. Session session = sessionFactory.openSession();
  7. Transaction transaction = session.beginTransaction();
  8. Person person = (Person)session.get(Person.class, 1L);
  9. person.setPname("asdsss");
  10. session.evict(person);//脱管状态
  11. session.update(person);//把对象的状态转化成持久化状态
  12. transaction.commit();
  13. session.close();
  14. }

1.3 对象的持久化是相对于session来说

    
    
    
    
  1. /**
  2. * 一个对象是否是持久化对象是针对某一个session而言的
  3. */
  4. @Test
  5. public void testSession(){
  6. Session session = sessionFactory.openSession();
  7. Transaction transaction = session.beginTransaction();
  8. Person person = (Person)session.get(Person.class, 1L); //94
  9. person.setPname("asfd");
  10. transaction.commit();
  11. session.close();
  12. session = sessionFactory.openSession();
  13. transaction = session.beginTransaction();
  14. person.setPname("aaaaaaa");//person对象对于94的session来说是一个临时状态的对象
  15. //session.update(person);
  16. transaction.commit();
  17. session.close();
  18. }

1.4 根据对象的状态,session决定是否可以进行数据库的操作

    
    
    
    
  1. /**
  2. * 当执行transaction.commit的时候,hibernate内部会检查session
  3. * 1、如果一个对象为临时状态的对象,则session不会管.例如15-17行
  4. * 2、如果一个对象是持久化状态的对象,如果有ID值,并且和数据库对应,那么先把该对象与             快照进行对比,如果一致,则什么都不做 ,
  5.              如果不一致,则发出update语句
  6. * 3、如果一个对象是持久化状态的对象,如果没有ID值,则会发出save语句
  7. */
  8. @Test
  9. public void testMuplyOption(){
  10. Session session = sessionFactory.openSession();
  11. Transaction transaction = session.beginTransaction();
  12. Person person = new Person();
  13. person.setPname("rrr");
  14. person.setPsex("asdfasdf");
  15. Person person3 = new Person();
  16. person3.setPname("rrr");
  17. person3.setPsex("asdfasdf");
  18. session.save(person);
  19. Person person2 = (Person)session.get(Person.class, 1L);
  20. person2.setPname("afds45");
  21. transaction.commit();
  22. session.close();
  23. }

1.5 对数据库操作的前提是:必须是持久化状态

    
    
    
    
  1. /**
  2. * 在最后一次提交事务前,已经清楚了session和所有person的关系,
  3. * 即person已经是托管状态,就算再提交事务已经没有任何sql语句输出。
  4. * 对数据库操作的前提是,必须是持久化状态
  5. */
  6. @Test
  7. public void testMutiplyOption2(){
  8. Session session = sessionFactory.openSession();
  9. Transaction transaction = session.beginTransaction();
  10. Person person = new Person();
  11. person.setPname("asdfads");
  12. person.setPsex("er");
  13. session.save(person);
  14. transaction.commit();
  15. session.evict(person);
  16. session.close();
  17. session = sessionFactory.openSession();
  18. transaction = session.beginTransaction();
  19. session.update(person);
  20. session.clear();
  21. transaction.commit();
  22. session.close();
  23. }

1.6 总结

day02_Hibernate_第1张图片
    对象的状态目前可以分为如下:
              临时状态:new
              持久化状态:get( )、save( )、update( )
              托管状态:evict( )、clear( )、close( )

2. 对象的状态-3

    一个session对应一个事务
    把主键的产生机制改为:
    通过程序可以看出,按理来说不可能发送sql语句的。可是:
     day02_Hibernate_第2张图片
    通过调试可以发现,在save的时候就已经发出了sql语句。因为是identity

    session是打开一个数据库链接
     在hibernate中session和事务时绑定在一起的,由session产生事务
day02_Hibernate_第3张图片

3. 一对多的单项关联-cascade-1-保存班级、保存学生

     本例子用包:hibernate_sh_rel
    类OneToManySingleTest.java

3.1 保存班级的同时级联保存学生

    
    
    
    
  1. public class OneToManySingleTest extends HiberanteUtils{
  2. @Test
  3. public void testSaveClasses(){
  4. Session session = sessionFactory.openSession();
  5. Transaction transaction = session.beginTransaction();
  6. Classes classes = new Classes();
  7. classes.setCname("传智上海云一期");
  8. classes.setDescription("很牛");
  9. session.save(classes);
  10. transaction.commit();
  11. session.close();
  12. }
  13. @Test
  14. public void testSaveStudent(){
  15. Session session = sessionFactory.openSession();
  16. Transaction transaction = session.beginTransaction();
  17. Student student = new Student();
  18. student.setSname("班长");
  19. student.setDescription("老牛:很牛");
  20. session.save(student);
  21. transaction.commit();
  22. session.close();
  23. }
  24. @Test
  25. public void testSaveClasses_Student(){
  26. Session session = sessionFactory.openSession();
  27. Transaction transaction = session.beginTransaction();
  28. Classes classes = new Classes();
  29. classes.setCname("传智上海云二期:");
  30. classes.setDescription("很牛X");
  31. Student student = new Student();
  32. student.setSname("班长");
  33. student.setDescription("老牛:很牛X");
  34. session.save(student);
  35. session.save(classes);
  36. transaction.commit();
  37. session.close();
  38. }
  39. }

    
    



来自为知笔记(Wiz)


你可能感兴趣的:(day02_Hibernate)