hibernate精华总结

hibernate总结






一、关于多表:
多表是一种关系的表达,具体的有一对多,多对多这两种。




1、一对多关系,如订单和客户,一个订单只能属于一个客户,但一个客户可以有多个
订单


“一”的那一方
1)中的主键作为“多”的一方的外键,对应的,在“一”的实体类中建立private Set<> xx
= new Set<>();其中的泛型是“一”这个对象,在“一”的这一方要用private XX xx;XX
为其主键对象。




2)在“一”的那一方配置
<Set name="Set集合名">
<key column="外键名"/>
<one-to-many class="关联类"/>
</Set>




3)在“多”的那一方配置
<many-to-one name="对象名" column="外键名" class="关联类"/>








2、多对多关系,如课程与学生之间的关系
引用两者的主键作为外键,生成第三张中间表为两者建立起关系.




在两者的实体类中要分别建立对方类的Set集合




在两者的配置文件中,添加以下配置
<Set name="Set集合名" table="第三张关联表名">
<key column="自身主键名" />
<many-to-many class="关联类" column="关联类主键名" />
</Set>






3、inverse属性
inverse本意为反转,这个属性默认值为false,他的作用的表示是否维护外键,false
则为维护,true则为不维护,即反转控制权,在一对多关系中一般由多的那一方来维护
外键,即一的那一方要配置inverse=“true”,反转外键的控制权;
如果是多对多的情况,一定要在任一方设置反转,让一方拥有外键的控制权,不然两
方都维护外键关系就会出现冲突。






4、cascade属性
cascade意为级联操作,默认值为none用值有:


update
save
save-update
delete  
all
none
all-delete-orphan(孤儿删除)


若设置级联为update,那么设置级联属性的一方持久化后,无需再保存关联的另一方
需要注意的是,一般不使用delete和all-delete-orphan,这两个值很危险,一旦误删
会产生严重后果。






二、hibernate检索(查询)

 1、最简单的查询:
session.get(对象class,id)-----》通过id查询出对象,此id对应的对象必须
唯一。
 
 2、HQL查询
hibernate query language -----》hibernate的独家查询语言,需要些少量的
sql语句。

1)完全查询:
String hql ="from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集

2)条件查询:
按id查询:
String hql = "from Xxx where id = ?";
Query query = session.createQuery(hql);
query.setParameter(0,“idname”);
Xxx xx = (Xxx)query.uniqueResult();

匿名方式:
Stirng hql = "from Xxx where :id = c_id";
Query query = session.createQuery(hql);
query.setParameter("c_id","idName");
Xxx xx = (Xxx)query.uniqueResult();


3)分页查询
String hql = "from Xxx";
Query query = session.createQuery(hql);
query.setFirstResult(0);//起始索引
query.setMaxResults(2);//查询条数,相当于limit 0,2
索引=(当前页数-1)*查询条数

4)查询总条数
String hql = "select count(*) from Xxx";
Query query = session.createQuery(hql);
int count = (Long)query.iterate().next().intValue();
或写成Number count = (Number)query.uniqueResult();

5)投影查询
String hql ="select xxx属性 from Xxx对象";
Query query = session.createQuery(hql);
List list = query.list();//返回对象结果集

6)投影查询并把结果集给封装成对象
String hql ="select new Xxx(1属性,2属性) from Xxx对象";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();//返回对象结果集
使用这个hql时要确保Xxx对象中提供了相应的构造方法

7)多表查询
|-内连接
|-外连接
|-左外连接
|-右外连接


内连接:
String hql = "from Xxx x inner join x.属性";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();

迫切内连接:
String hql = "from Xxx x inner join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();
//直接获得与x.属性连接的Xxx对象

左外连接、右外连接
String hql = "from Xxx x inner left/right join fetch x.属性";
Query query = session.createQuery(hql);
List<Xxx> list = query.list();



三、QBC查询(query by criteria)
无sql语句的查询,完全面向对象

1、全部查询
Criteria c = session.createCriteria(Xxx.class);
List<Xxx> list = c.list();

2、条件查询
Criteria c = session.createCriteria(Xxx.class);
c.add(Restrictions.内置的条件);

3、分页查询
Criteria c = session.createCriteria(Xxx.class);
c.setFirstResult(0);
c.setMaxResults(2);

4、排列查询
Criteria c = session.createCriteria(Xxx.class);
c.addOrder(Order.asc("排序的列名"));
List<Xxx> list = c.list();


5、离线查询
    //在web层创建一个离线criteria对象方便在web层进行条件的拼接
DetachedCriteria dc = DetachedCriteria.forClass(Xxx.class);
dc.add(Restrictions.条件);//拼装好的条件
//dao层将离线查询对象关联到当前session上
Criteria c = dc.getExecutableCriteria(session);
...





四、查询优化


1、懒加载(延迟加载):get()--改为--》load
load方法是在执行时不发送任何sql语句,而是先返回一个对象,
只有在使用该对象时才查询;
而sava方法在执行时就会发送sql语句,无论这个被查询到的对象
使用还是不使用









猜你喜欢

转载自blog.csdn.net/pbrlovejava/article/details/80232203