【Hibernate】04 主键策略 & CRUD

实体类编写规范:

- 每个属性不应该被公开的访问,设置私有

- 提供可以访问和设置的方法,GETTER & SETTER

- 必须编写一个主键属性【ID 唯一值】

- 建议使用基本类型的包装类,因为基本类型不可以表示NULL


主键生成策略:

- HIbernate 要求实体类里面有一个属性作为唯一的值,对应表主键,主键可以不填

<generator class="native" /> <!-- 主键自增策略 -->

- 策略值项:

  1、increment 

    支持long、int、short类型,自增方式的唯一标识,步长1,

    无其他进程插入SQL可使用,不支持多线程操作【脏数据危险】

  2、identity 

    采用数据库底层提供的主键生成标识符,

    必须是数据库支持的数据类型

  3、sequence 

    根据底层数据库序列生成标识符,

    条件是数据库支持序列

  4、native 

    底层数据库对自动生成标识符的能力来选择【2、3、Hilo】其中的一种,

    可跨数据库平台开发

    【生成:主键、非空、自增、int类型】

  5、uuid 

    128位的UUID算法生成标识符,

    绝对唯一标识,占用空间太多

    【生成:主键、非空、VARCHAR类型】

    Java数据类型要使用Java.lang.String

  6、assigned

    由Java程序生成标识符,

    如果没有指定generator元素,默认使用此策略【自然主键】


按ID查询:

    @Test
    public void query01(){
        Session session = HibernateUtil.getSession();
        
        // 实体类的字节对象,ID值
        User user = session.get(User.class, 4);
        System.out.println(user);
        session.close();
    }

修改操作:

先查询,再修改

从思路上是正确的,实际上不需要查询的步骤,

只需要new 一个对象,输入新的字段值和要修改的原始ID

调用UPDATE方法就行了。

另外SAVE也可以用来修改,但是这违背了使用规范,不要这么使用就对了

    @Test
    public void query02(){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();

        Transaction transaction = session.beginTransaction();

        // 实体类的字节对象,ID值
        User user = session.get(User.class, 4);
        System.out.println(user);

        // 修改字段
        user.setUser_name("用户1004");

        // 更新操作
        session.update(user);

        transaction.commit();
        session.close();
        sessionFactory.close();
    }

注意:

只修改部分字段,建议使用查询,再改值,在调用修改,因为可以保证其他不变的字段不改动

另外频繁这么修改,性能效率很低,本质上UPDATE是对这个记录完全覆写,

如果数据表一个字段数特别的多,调用修改性能效率真的很低

删除操作:

先查找,后删除

    @Test
    public void query03(){
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();

        Transaction transaction = session.beginTransaction();

        // 实体类的字节对象,ID值
        User user = session.get(User.class, 4);
        System.out.println(user);
        
        // 删除操作
        session.delete(user);
        
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

也可以是直接获取ID然后封装给实体类对象

再注入给删除操作

        User user = new User();
        user.setUser_id(1);

        // 删除操作
        session.delete(user);

实体类对象的状态

- 瞬时状态 

  对象没有ID值,对象和Session没有关联

- 持久状态

  通过Session获取的,对象和Session具有关联关系

- 托管状态

  对象有ID值,对象和Session没有关系


SaveOrUpdate方法

根据实体类实例的状态来调用不同的操作

- 注入瞬时状态的对象,执行的是添加操作

- 注入托管状态的对象,执行的是修改操作

- 注入持久状态的对象,执行的是修改操作


 

原文地址:https://www.cnblogs.com/mindzone/p/12864255.html