Hibernate(4) 基本CRUD操作 以及实体类的几种状态

版权声明:转载需经同意,谢谢! https://blog.csdn.net/Big_KK/article/details/82026770

使用Hibernate进行CRUD操作

1.CRUD操作

在了解完Hibernate的对象之后,可以尝试进行CRUD的操作,毕竟是Dao层的框架,那么最起码要和数据库产生点关系,看看是个什么样的结果呗。代码比较简单,就直接贴了。在里面进行了简单的说明,写出来还是为了加深印象,好记性不如烂笔头,好好总结才是自己的! 好了回正题,下面列出了基本的CRUD操作:

1.以下的操作未按照正常的try…catch…方式对事务进行分情况的提交/回滚操作。默认是按不发生异常的情况下进行操作的,
2.测试时主键生成策略为UUID, 代码中的字符串就是主键值
3.实体类Person具有的属性:id(主键),name,age,gender,birthday。

public class Main {
    static SessionFactory sessionFactory = null;
    //插入操作
    @Test
    public void test_insert() throws ParseException {
        sessionFactory = HibernateUtils.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        Person person1 = new Person();
        person1.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2015-05-20"));
        person1.setName("KK");
        person1.setAge(20);
        person1.setGender("男");
        /*
        * 使用save()方法来将一个对象到建立映射关系的表里面
        * 参数:save(建立映射关系的实体类对象)
        * 返回:该行记录的主键值key
        * >插入的方法还可以使用:session.saveOrUpdate()方法进行,参数一致。
        * */
        Serializable key = session.save(person1);
        System.out.println(key);
        session.getTransaction().commit();
    }

    //通过设置的主键获取单个实体类的对象
    @Test
    public void test_get(){
        sessionFactory = HibernateUtils.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        /*
        * 使用get()方法通过id查询一个对象:
        * 参数:get(实体类A的class对象, 要查询的id)
        * 返回一个A的对象
        * */
        Person person = (Person) session.get(Person.class, "4028aa3e656c2fc401656c2fc63c0000");
        System.out.println(person.toString());
        session.getTransaction().commit();
    }

    //进行数据的修改操作
    @Test
    public void test_update() throws ParseException {
        sessionFactory = HibernateUtils.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        /*
        * 使用update()方法更新对象的信息。
        * 大致流程:首先获取到要修改的实体对象,然后对这个实体对象的某写信息进行修改,最后再次将该对象作为最新值进行更新
        * 修改指定信息的实现:在使用update()方法的时候,会确定传递进来这个实体的主键值,然后根据这个值去数据库里面修改。
        * 参数:update(实体类对象)
        * 在修改了一个实体之后,不使用update()方法,调用save()对这个实体再次插入也同样可以达到修改数据的目的。但是不推荐这样做!
        * >修改的方法还可以使用:session.saveOrUpdate()方法进行,参数一致。
        * 在调用update()方法时候,会根据传递的实体信息更新[所有的值],如果此时传递的实体类信息不完整,那么不完整的信息也会更新进去(前提:传递了正确的主键值)。
        * */
        Person person = (Person) session.get(Person.class,"4028aa3e656c2ffd01656c2fff060000");
        person.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2015-05-20"));
        session.update(person);
        session.getTransaction().commit();
    }

    //进行删除操作
    @Test
    public void test_delete(){
        sessionFactory = HibernateUtils.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        /*
        * 使用delete()方法进行删除操作
        * 方式1:使用设置的主键获取到实体对象,将其作为参数传递进行,执行删除
        *       参数:delete(要删除的实体类对象)
        * 方式2:构造一个新的实体A,将其主键设置为要删除对象的主键值,作为参数传递给delete();
        *       参数:delete(构建的新的实体对象)
        * 二者给我感觉是一样的。之所以要传递对象,都是为了获取组件值,然后Hibernate在底层执行delete语句的时候将其作为where条件来定位删除的行,因为执行的是删除操作,所以对其普通属性的值就不关心了
        * */
        Person person = (Person) session.get(Person.class, "4028aa3e656c44c701656c44c8610000");
        session.delete(person);
        session.getTransaction().commit();
    }

    @AfterClass
    public static void endTest(){
        System.out.println(":::::test end, close sessionFactory");
        sessionFactory.close();
    }
}

2.实体类的几种状态

接下来简单说说实体类的几种状态,上面代码里面就提及了saveOrUpdate()方法,看字面意思就明白这个方法是进行插入或更新的,但是具体执行某个功能,就是通过实体类的状态决定的
实体类具有以下的几种状态:

每种不同状态的实体都无所谓是否设置了其他普通属性。


  1. 瞬时态
    该状态下的实体没有设置主键值,且和Session未产生关系。比如新建了一个实体类对象,为其普通属性设置了参数,那么此时这个对象就是瞬时态
  2. 持久态
    该状态下的实体设置了主键值,并与Session对象有关系,比如我们使用get()方法获取到的一个实体对象,肯定是包含主键值的,并且由于是通过Session对象获取的,所以和Session也是有关系的
  3. 托管态
    该状态下的体设置了主键值,但是和Session对象没关系比如实例化一个实体对象,为其设置了主键值,但是仅此而已,那么这个对象就是托管态的。

上面所提及的saveOrUpdate(Object obj)方法根据传递进去的实体状态决定调用哪个功能,当实体状态是瞬时态时候,调用save()功能,当实体状态是持久态以及托管态的时候,执行uodate()功能。 一句话:实体具有主键值了,就更新,否则插入

猜你喜欢

转载自blog.csdn.net/Big_KK/article/details/82026770