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")); //设置投影集合的排序方式 按房屋表的租金升序排列