hibernate


cascade:save-update,delete / all影响关联外键的表
inverse默认false 主表单向调整 会主动更新关联外键的数据   true需要双向赋值

order-by:列名 asc排序 也可以在javabean的映射文件中set标签添加属性

    
lazy类级默认为true延迟加载   设置为false表示立即加载
lazy一对多多对多 extra加强延迟加载 集合长度
lazy多对一默认为proxy 代理延迟加载
    no-proxy 无代理延迟加载
        设置为false表示立即加载
session关闭报错--->
Hibernate.initialize(对象) 初始化对象   有关联访问的需求


浏览器->服务器->web应用->Servlet->事务biz->dao->db数据库
db数据库->dao->biz->Servlet->jsp->服务器运行完后产生html->浏览器


多对多关联关系 inverse属性一个false一个true  大部分主表false分表true
项目表 pid pname
雇员表 eid ename
关系表 pid eid
项目表的映射文件
set集合 标签属性 name=集合 cascade (1)table="关系表"
    (2)key 字段=关系表项目外键
    many-to-many 类=雇员类 (3)字段=关系表雇员外键

雇员表的映射文件
set集合 标签属性 name=集合 (1)table="关系表"
    (2)key 字段=关系表雇员外键
    many-to-many 类=项目类 (3)字段=关系表项目外键





左连接 left join
from dept d left join d.emps e order by d.deptno
d.emps是部门javaBean里的雇员对象集合 通过映射这样写hql语句 找关联的集合
返回值List<Object[]> result  
数组里两个对象result[0],result[1]
object[]==> [部门,雇员]

迫切左连接 left join fetch
from dept d left join fetch d.emps e order by d.deptno
返回值List<Dept> dept
把查询到的雇员放进了dept对象的雇员集合里

左外连接是左表全 右表补
右外连接是左表补 右表全
内连接两表必须匹配

没有迫切右外连接
返回值左表为主的对象集合 不会出现集合对象为null后被右表赋值


hql=select e from Emp e join e.dept d where d.dname=?
hql=select e from Emp e,Dept d where d=e.dept and d.dname=?

hql=from Emp e where e.dept.dname=:dname //隐式内连接
hql=select e.empno,e.ename,e.dept.dname from Emp e where ... ;


命名查询
配置文件中
<query name="findEmpByJob">
   <![CDATA[
    from Emp e where e.job=:job
   ]]>
</query>
Dao层
getSession().getNamedQuery("findEmpByJob").setParameter("job",arg).list();


注解部分===================================================================>


@Entity   把一个类声明为持久化类  通用
//@org.hibernate.annotations.Entity(dynamicUpdate=true)     添加动态更新

@Table(name="sys_user")     映射到指定数据库中的表

@Proxy(lazy=true)          true懒加载  false立刻加载   

主键
get方法上面添加@Id
自增@GeneratedValue(strategy=?)
(oracle的序列
自增@GeneratedValue(strategy=sequence,generator="seq")
@SequenceGenerator(name="seq",sequenceName="数据库中的序列名SEQ_ID",allocationSize=3)
//allocationSize数值影响序列,主键+3增长)
@Column(name="")
属性          get方法上面添加 规范


临时属性 和数据库无关的属性    注解后不会进行映射
get方法上添加@Transient

@OneToMany(cascade=

{CascadeType.ALL},fetch=LAZY,targetEntity=House.class,mappedBy="users")
//mappedBy="users"类似invers

@ManytoOne(fetch=lazy,targetEntity=User.class)
@joinColumn(name=多对一关联字段user_id)

多对多,   proemp为关系表 pro项目表 emp雇员表   关系表中只有项目表主键id和雇员表主键id

以下是项目表的持久类

@ManytoMany(cascade=cascadeType.all , fetch=fetchType=lazy)

@joinTable(name="关系表" ,

joinColumns={ @joinColumns(name="在关系表中的项目表主键") } ,

inverseJoinColumns={@joinColumn(name="在关系表中雇员主键")} )


注解命名查询  写在javaBean里面
@NamedQuery(name="sql名字" query="sql语句")


开启二级缓存========================================================>  jar:commons-logging  ,   ehcache
cache.use_second_level_cache=====true
propertie=====cache.provider_class    value======org.hibernate.cache.EhCacheProvider


持久化类的配置文件中
<cache usage="read-only"/> //只读 效率高
nonstrict-read-write      //适用于低频率变化的数据,极少被修改,允许偶尔脏读
read-write                //经常读少改,防止脏读
transactional             //支持事务,效率低,事务隔离级别高,防止脏读和不可重复读

二级缓存的命名查询
在配置文件中添加property name=cache.use_query_cache  = true
语句中查询session.createquery("from tableName").setCacheable(true).list();


离线查询  DetachedCriteria ==========================================================================

(1)DAO层的离线查询,首先传入参数DetachedCriteria对象.getExecutableCriteria(HibernateSessionFactory.getSession()).list()

(2)业务层

            DetachedCriteria detachedCriteria=DetachedCriteria.forClass(House.class,"h")
                            .createAlias("h.user", "u")                      
                            .add(Restrictions.eq("u.uid", 3))                   //设置条件  uid等于3的数据
                            .add(Restrictions.ilike("h.contents", "333",MatchMode.ANYWHERE))   //MatchMode类型设置关键字的用法 此处设置333出现在任何下标                                    ilike()方法不区分大小写  anywhere=任意位置 start=以这个关键字开头的 end=关键字结束
      //                      .getExecutableCriteria(HibernateSessionFactory.getSession()).list();

   List list=dao.findHouse(detachedCriteria);
(3)测试            for(Object obj:list){
                    House h=(House)obj;
                    System.out.println(h.gethMid()+h.getContents());
                }
         

离线子查询   DetachedCriteria对象为基础的第二次查询
//            DetachedCriteria priceAvg=DetachedCriteria.forClass(House.class)
//                                        .setProjection(Property.forName("price").avg());
//            HibernateSessionFactory.getSession().createCriteria(House.class).
//                                        add(Property.forName("price").gt(priceAvg)).list();

//三表连接查询

 DetachedCriteria.forClass(District.class,"d")                  //主表区district 别名d
                            .createAlias("d.streets","s",CriteriaSpecification.LEFT_JOIN)     //持久类d表中的streets街道对象的集合 别名s 左连接
                            .createAlias("s.houses","h",CriteriaSpecification.LEFT_JOIN)    //持久类s表中的houses房屋对象的集合 别名h 左连接
                            .setProjection(Projections.projectionList()           //设置投影   投影集合
                                    .add(Property.forName("h.price").avg().as("priceAvg"))          //添加条件 房屋表中的租金平均值 字段别名priceAvg
                                    .add(Property.forName("d.dname").group())          //添加条件  按区表的地区名字段分组查询
                            ).addOrder(Order.asc("priceAvg"));              //设置投影集合的排序方式  按房屋表的租金升序排列
           


           

原文地址:https://www.cnblogs.com/m97i/p/7407407.html