hibernate API笔记

  • 格式:doc
  • 大小:77.50 KB
  • 文档页数:11

hibernate API笔记 仅供查找! 为了通过反射机制来实例化对象,需要提供一个无参的构造函数

使用static实现全局的初始化操作, private static final.... 在static进行new初始化...然后在使用一个get方法来获取实例 这样使用与用一个Util辅助类的形式来创建单例

create 用于自动创建数据库,第一次使用后可以注释掉,否则表示删除继续重建

inverse用于设置在多方 POJO:Plain Old Java Object 为了使用延迟关联加载代理.不要在非Final类中声明public final方法 cascade表示级联 all为全部 默认为none,通常使用在one-to-one 和one-to-many关系中, 如果子对象的寿命限定在父对象的寿命之内,可以通过cascade="all,delete-orphan" 变成自动生命周期管理的对象

可以在set里面添加order-by来增加排序语句 get方法不抛出异常,load方法会抛出异常 使用的都是session.get(Cat.class,主键值); 进行加载 其中get无的情况下,会得到null对象

查询 HQL QBE QBC SQL

HQL中可以使用复杂的对象或者简单的类型来生成查询条件 比如 List cats=session.createQuery("from Cat as cat where cat.birthdate < ?") . setDate(0,date).list(); 同样可以使用setEntity(0,对象实例) 来直接加入对象进行条件映射 .setString设置简单的字符串

如果返回的结果只有一个,可以使用.setEntity()等条件后.uniqueResult(),这样返回一个Object,然后进行类型的强制转换

也可以使用 Set uniqueMothers = new HashSet(query.list())来过滤重复的查询结果 使用迭代式的获取结果Iterating 某些情况下使用iterate方法得到更好的性能,不过是在缓存或者session已存在的情况,不然更慢

有的时候根据语句会生成Object[]形式的结果,按照例子都是用.list().iterator()的方法执行查询,然后进行遍历,通常只有一个结果 其中第一个就是Object[]

标量查询...就是统计函数等,count min等SQL函数,同样使用上面的方法进行遍历结果 while(results.hasNext()) { Object[] row = (Object[]) result.next(); Color type=(Color)row[0] Date oldest = (Date) row[1].... 使用对象类型进行接受(值类型使用对应的包装类型) }

绑定参数 主要形式有? 和:参数名 两种方法 :参数名 形式 Query q=session.createQuery("from xx where c=:name"); q.setString("name","XXXX")

?形式 使用0开始的下标索引 还有一种批量的设置单个元素为多条件的方法 比如使用在sql的 in方法之上时 Query q = session.createQuery("from Deon cat where cat.name in (:nameList)"); q.setParameterList("nameList",names); List cats = q.list();

分页 Query q = session.createQuery("from Domec cat"); q.setFirstResult(20); q.setMaxResults(10); List cats = q.list();

集合过滤器是一种用于一个持久化集合或者数据的特殊查询, Collection blackKittens = session.createFilter(pk.getKittens(),"where this.color = ?").setParmeter(Color.Black, Hibernate.custom(ColorUserType.class)).list() 可以不使用from,同时也可以设置返回结果

使用原生的SQL的查询 可以使用session.Connection()来获取JDBC Connection对象 也可以使用 List cats = session.createSQLQuery("SELECT {cat.*} FORM CAT {car} WHERE ROWNUM<10","cat",Cat.class).list(); 进行直接的SQL语句调用,比如把sql别名用{}大括号包围起来 可以使用session.flush() 把当前session中的数据进行刷新 如果使用native方式生成的ID(主键) 他们一执行save就会被插入

拦截器--功能更类似与触发器,用于在Hibernate触发操作的时候自动调用 分为两个级别 session和sessionfactory

通过继承EmptyInterceptor类来实现. 加载到Session的方法,在openSession的方法中传入new 接口实现类() 进行注册 也可以使用在new Configuration().setInterceptor(new AuditInterceptor()) 来注册SessionFactory级别的拦截器

同样也可是用事件系统来代替拦截器,或者作为拦截器的补充 可以用编程的方式和xml来注册事件 其中编程的方法可以共享一个实例

比如loadEvent需要实现LoadEventListener Configuration cfg = new Configuration(); LoadEventListener[] stack = {new MyloadListener(),new DefaultLoadEventListener()}; cfg.EventListeners().setLoadEventListeners(stack); 其中第一个为接口实现类,第二个为接口

批量插入(Batch inserts) 在循环添加的时候.使用session.flush()和session.clear()进行内存的释放,最好的和JDBC批量设置相同 如下 hibernate.jdbc.batch_size=20 也可以在批量处理时关闭二级缓存 hibernate.cache.use_second_level_cache false 当不是必须的,还有其他的方法

同样更新的时候也适合于清空内存 HQL查询 最简单的就是 form 实体类名 也可以使用as取别名, 不过可以省略 也可以使用,分开进行多表查询

关联的方式 inner join 内连接 left outer join 左外连接 right outer join 右外连接 full join 全连接 不常用 其中可以简写去掉outer 也可以使用with关键字 提供而外的join条件 from Cat as cat left join cat.kittens as kitten with kitten.bodyWeight>10

fetch连接允许使用一个选择语句相一组集合随着他们父对象的初始化而初始化,有效的代替了配置文件中的外连接和延迟声明 from Cat as cat inner join fetch cat.mate left join fetch cat.kittens 不过不可以和独立的with条件 以及setMaxResult等一起使用

join的语法包括显示和隐式的两种, 在HQL中直接写入的为显式,使用多个.个进行属性编写的为隐式,都会在生成的SQL中加入join

查询语句可以返回多个对象或属性,存放在Object[]队列中,也可以存放在一个list 或者一个对象中(自定义的构造函数) 下面描述例子

select new list(属性,属性...) select new Family(属性,属性,属性); 这个尤其比较有用

也可以直接在HQL里面写上SQL的统计函数,并且封装成Map对象 select new map(max(属性) as max, min(bodyWeight) as min,count(*) as n) from Cat cat 其中会生成别名为key的键值对map

聚集函数---上面说到的SQL统计函数 受支持的聚集函数如下 avg(..) sum() min() max() count() count(distinct...) count(all...)

多态查询,当进行一个父类查询的时候,会返回子类的实例,或者实现了该接口的实例 from java.lang.Object o 将返回所有的对象

在HQl中的=运算符 可以直接用来比较对象 特殊属性的小写 id 可以作为对象的标识符(主键) 也可以使用在符合主键里面 id.子组件属性名 特殊属性的class用于在多态查询的时候 指定一个实例鉴别来保存对象 from Cat cat where cat.class = DomesticCat

表达式...非常多 常用的有in('','','') 和between 'a' and 'b'