Hibernate(2)实体对象

目录

一、.Hibernate实体的创建规则

二、hibernate主键生成策略

三、hibernate对象状态

四、hibernate一级缓存

五、指定hibernate操作数据库的隔离级别

六、hibernate中的事务控制


 

 

 

一、.Hibernate实体的创建规则

1.持久化类需要提供无参的构造方法

2.持久化类的属性需要私有,对私有的属性提供共有的get和set方法

3.持久化类的属性,需要尽量使用包装类型。因为包装类型和基本类型的默认值不同,比如:

4. 持久化类需要有一个唯一标识OID与表的主键对应  每个表都需要有主键

5.持久化类不要使用final来修饰-----hibernate使用cglib来生成代理对象,代理对象是继承被代理对象的如果使用final修饰,将无法继承。

二、hibernate主键生成策略

主键类型

自然主键:把具有业务含义的字段作为主键,称之为自然主键,比如身份证号码,电话号码----少见  如果出现变更维护困难

代理主键:把不具备业务含义的字段作为主键,称之为代理主键,字段一般取名为id通常为整数类型。

hibernate常用的主键生成策略

identity:主键自增,由数据库来申城主键值,录入时不需要指定主键

sequence:Oracle中的主键生成策略

increment:主键自增,由hibernate来维护,每次插入前都会查询最大的id值+1作为新的主键(开发中不使用,不安全)

hilo(了解):高低位算法,主键自增,由hibernate来维护,开发是不使用

native:hilo、sequence、identity自动三选一策略。自动识别数据库选择

uuid:产生随机字符串作为主键,主键类型必须为string类型

assigned:自然主键生成策略。hibernate不会管理主键值,由开发人员自己录入。

三、hibernate对象状态

瞬时状态  没有id没有和session关联

持久化状态  有id  ,和session有关联

游离托管状态   有id没有和session关联

 /**
     * 测试对象三种状态
     */
    @Test
    public void test2(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        //------数据库操作
        Customer c = new Customer();    //没有id,没有和session关联==>瞬时状态
        c.setCust_name("好啊好啊");     //没有id,没有和session关联==>瞬时状态
        session.save(c);  //执行保存    //持久化状态  有id,有关联


        //~~~~~~~~~~~~~~~~~~~
        transaction.commit();//提交事务
        //transaction.rollback();//回滚
        session.close();     //游离托管状态  有id,没有关联

    }

    /**
     * 三种状态特点
     * save方法,将瞬时状态转换成持久状态
     * 主键自增,执行save方法的时候,为了将对象状态转换为持久化状态,必须生成id值,所以需要执行insert语句来生成id
     *increment  执行save方法,为了生成id会执行查询最大id值的sql语句。
     * */
    @Test
    public void test3(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        //------数据库操作
        Customer  c= new Customer();    //没有id,没有和session关联==>瞬时状态
        c.setCust_name("好啊好啊");     //没有id,没有和session关联==>瞬时状态
        session.save(c);  //执行保存    //持久化状态  有id,有关联


        //~~~~~~~~~~~~~~~~~~~
        transaction.commit();//提交事务
        //transaction.rollback();//回滚
        session.close();     //游离托管状态  有id,没有关联

    }

    /**
     * 三种状态特点
     * 持久化状态特点:持久化状态对象中的任何状态都会自动同步到数据库中
     * */
    @Test
    public void test4(){
        Session session = HibernateUtils.openSession();
        Transaction transaction = session.beginTransaction();
        //------数据库操作
        Customer c = session.get(Customer.class, 3);   //持久化状态  有id ,与session有关联
        c.setCust_name("xxx");

        //session.save(c);  //执行保存    //持久化状态  有id,有关联


        //~~~~~~~~~~~~~~~~~~~
        transaction.commit();//提交事务
        //transaction.rollback();//回滚
        session.close();     //游离托管状态  有id,没有关联

    }

三种状态的转换图 

四、hibernate一级缓存

提高查询效率

较少不必要的修改语句发送

五、指定hibernate操作数据库的隔离级别

在主配置文件中指定

六、hibernate中的事务控制

业务在开始之前打开事务,业务执行完以后提交事务,执行过程中出现异常,则进行回滚

在dao层操作数据库需要使用session,在对service控制事务的时候也需要使用session对象完成,需要确保到层和service层使用的是同一个session对象

在hibernate中确保使用同一个session的问题

注意1.需要在主配置文件中配置

<property name="hibernate.current_session_context_class">thread</property>

然后使用getcurrentsession方法

测试

    //getCurrentSession返回同一个与线程绑定的session  true
    @Test
    public  void  test2(){
        Session s1 = HibernateUtils.getCurrentSession();
        Session s2 = HibernateUtils.getCurrentSession();
        System.out.println(s1==s2);
    }

    //返回不同的session false
    @Test
    public  void  test3(){
        Session s1 = HibernateUtils.openSession();
        Session s2 = HibernateUtils.openSession();
        System.out.println(s1==s2);
    }

注意2:通过getCurrentSession方法获得的session对象,当提交事务后,session会自动关闭,切忌不需要手动调用close方法

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值