Hibernate注意项

Hibernate实体规则

1.持久化类提供无参数构造

2.成员变量私有,提供getset访问,提供实行

3.持久化类属性,尽量使用包装类型

4.持久化类需要提供oid与数据库中的主键列对应

5.不要使用final修饰class

 

实体类创建的注意事项

主键类型:

  自然主键(少见):表的业务列中,有某项业务列符合,必须有,并且不重复的特征时,该列可以作为主键使用

  代理主键(常见):创建一个无意义的列作为主键

主键生成策略:

<!-- generator 主键生成策略 
     identity:主键自增,由数据库来维护主键值,录入时不需要指定主键
     increment(不用):主键自增,由hibernate来维护,每次插入会先查询表中最大值,+1做为主键值(多人同时插入时会导致数据丢失)
     sequence:Oracle中的主键生成策略
     hilo:高低位算法,数据库属性自增的算法,由hibernate来维护,与increment不一样,这个hilo算法能够保证数据库主键永远不一样
   
native:hilo+sequence+identity三选一策略,检测到非oracle支持主键自增,那选择identity,检测到是oracle,选择sequence
自增的方法,hilo遇到不支持自增不支持sequence,市面目前没有这种数据库uuid:产生一个随机字符串作为主键

-->

<generator class="native">
</generator>

对象状态:

  对象分为三种状态:

    瞬时状态:没有id,没有与session关联

    持久化状态:有id,与session有关联

    托管状态:有id,没有与session关联

  

package com.littlepage.state;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.littlepage.entity.Customer;

public class Demo {
    public static void main(String[] args) {
        Configuration conf=new Configuration().configure();
        SessionFactory sf=conf.buildSessionFactory();
        Session session=sf.openSession();
        Transaction tx=session.beginTransaction();
        
        Customer cus=new Customer();//没有id,没有与session关联=瞬时状态
        cus.setName("Poly");//瞬时
        cus.setAge(15);
        session.save(cus);//持久化状态
        tx.commit();
        session.close();//游离状态
        sf.close();
    }
}

瞬时-->持久化-->托管

状态流程

进阶-一级缓存:

一级缓存提高数据库操作的效率。

缓存:暂时存储在内存上。第一次接触是在IO流里面,缓存的目的是为了提高效率。(预加载)

HQL查询语句:

     Configuration conf=new Configuration().configure();
        SessionFactory sf=conf.buildSessionFactory();
        Session session=sf.openSession();
        Transaction tx=session.beginTransaction();
        //1.书写HQL语句
        String hql="from Customer where age=15";//查询所有Customer对象
        //2.根据HQL语句创建查询对象
        Query query=session.createQuery(hql);
        //3.返回list结果
        List<Customer> list=query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        tx.commit();
        session.close();//游离状态
        sf.close();
        
     ?占位符查询
     //1.书写HQL语句 String hql="from Customer where age=?";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置参数 query.setInteger(0, 15);
        
     命名占位符查询
     //1.书写HQL语句 String hql="from Customer where age=:age";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置参数 query.setParameter("age", 15);
        分页查询
//1.书写HQL语句 String hql="from Customer";//查询所有Customer对象 //2.根据HQL语句创建查询对象 Query query=session.createQuery(hql); //设置分页信息 query.setFirstResult(3);//起始值索引 query.setMaxResults(2);//每页的多少
        Criteria查询
        Criteria criteria=session.createCriteria(Customer.class);
        List<Customer> list=criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }            
        约束条件
        Criteria criteria=session.createCriteria(Customer.class);
        criteria.add(Restrictions.eq("age", 12));
        List<Customer> list=criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }    
        聚合函数查询
Criteria criteria=session.createCriteria(Customer.class); criteria.setProjection(Projections.rowCount()); Long count=(Long)criteria.uniqueResult(); System.out.println(count);
        //原生SQL查询
        String sql="select * from t_customer";
        SQLQuery query=session.createSQLQuery(sql);
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            for (Object objects2 : objects) {
                System.out.print(objects2+"\t");
            }
            System.out.println();
        }
        //原生SQL查询2
        String sql="select * from t_customer";
        SQLQuery query=session.createSQLQuery(sql);
        query.addEntity(Customer.class);
        List<Customer> list=query.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }

分别在什么情况下进行使用

HQL查询:查询多表查询,不是复杂多表使用

Creteria查询:单表查询

SQL原生查询:复杂的业务查询

 

posted @ 2019-04-13 15:10  SteveYu  阅读(241)  评论(0编辑  收藏  举报