SpringSide的Hibernate封装
来源:互联网 发布:淘宝助理 dat格式 编辑:程序博客网 时间:2024/05/22 12:02
SpringSide对Hibernate做了三层封装:
第一层:HibernateGenericDao,基于spring的HibernateDaoSupport,但加入了分页函数与各种Finder函数,并使用泛型避免了返回值强制类型转换。
第二层:HibernateEntityDao,基于HibernateGenericDao,用泛型声明Dao所管理的Entity类,默认拥有该entity的CRUD方法。
第三层:HibernateExtendDao,基于HibernateEntityDao,主要扩展各种选择性的功能。
关于三个类的详细注解请看JavaDoc,大致描述如下:
1 HibernateGenericDao
在Spring HibernateDaoSupport基础上封装的DAO,功能如下:
1.应用泛型:使得find(), get() 这些函数不再返回Object,而是返回T,不再需要强制类型转换。
2.提供各种finder的简便函数
应用了JDK5可变参数的hsql查询函数:List find(String hql, Object... values),支持find(hql),find(hql, param1); find(hql,param1,param2);find(hql,new Object[] {param1,param2}) 四种接口。
简单查询的简化函数:findBy(Class entityClass,String name,Object value) ,findUniqueBy(Class entityClass,String name, Object value),findByLike(Class entityClass,String name,Object value)
3.获得设置好的Query和Criteria:createQuery(String hql,Object... values) 和 createCriteria(Class<T> entityClass,Criterion... criterions)
Spring并没有很好的接口封装支持firstResult, maxResult, fetchsize,cache,cacheRegion 等多个查询参数,所以springside宁愿返回已设置好查询条件的Query和Criteria,让大家继续剩下的参数设置,最后再执行list(),注意那几个参数可以连续设置的,如:
createQuery(hql,param1).setFirstResult(10).setMaxResult(20).list();
4.分页函数:Page pagedQuery(Criteria criteria, int pageNo, int pageSize) 和Page pagedQuery(String hql, int pageNo, int pageSize, Object... args)
Page是SpringSide自行封装的一个典型Page类,pagedQuery与hibernate自身分页查询的差别是先运行一次count,获得符合条件的总记录数。
如果查询不需要总记录数,用普通的hibernate API,加上setFirstResult(),setMaxResult()就解决,不需要pagedQuery()。
5.判别对象属性在数据库中唯一的函数:isUnique(Class<T> entityClass,Object entity,String names)。
2. HibernateEntityDao
所有UserManager, ProductManager之类只管理一类对象的Manager类的基类,只需要在类定义处声明Entity类型即可
public class BookManager extends HibernateEntityDao<Book> {}
通过<Book>的定义,避免了HibernateGenericDao类各方法中必有的Class entityClass参数。
如果需要操作其他的Entity,比如BookManager可能需要处理Category(图书目录),可以注入CategoryManager。无需担心事务的问题,JavaEE的默认事务模型已能很好处理。
如果没有对应的CategoryManager,或者各种原因不想注入的话,可以使用BookManager继承自HibernateGenericDao的带entityClass参数的函数来操作Category的增删改,如Category category= this.get(Category.class, 1);
3. HibernateExtendDao
此类演示SpringSide 所作的一些扩展,大家可以按照自己的需要进行修改和扩展。
1. 支持对象不能被直接删除,只能设置状态列为无效。
接口UndeleteableEntityOperation,定义了要支持此功能必须实现的函数。
可以有接口(UndeletableEntity)和annotation(@Undeletable)两种形式来定义无效列,annotation列形式还可以定义标识对象已删除的状态属性的名称,用接口则必须实现setStatus()接口,在里面操作实际的状态属性。
两种方式的异同见侵入,非侵入?Interface vs Annotation。
2. 重载save(),在保存前先调用onValid() 函数
3. 增加find(Map map) 接口
默认查找与map中全部条件相同的entity。
条件的比较运算符默认为相同,用户也可以为属性名加上like_,largerthen_ 这样的前缀,则使用相应的运算符作比较(未完成)
- SpringSide的Hibernate封装
- SpringSide的Hibernate批量删除异常
- SpringSide封装Page类
- springside + hibernate 3 + hiberate search
- SpringSide的Coding Standards
- SpringSide的Coding Standards
- SpringSide的页面管理
- SpringSide的技术选型
- springside 推荐的编程
- SpringSide
- SpringSide
- SpringSide
- springside
- 触动 多项选择 获取关联的值 (ext js jQuery sturs hibernate springside)
- 修改springside实例helloworld变成hibernate数据库
- Hibernate的sessionFactory的封装
- Hibernate的Dao的封装
- SpringSide的Coding Standards(转)
- 跑步( Running . pas / c / C pp )
- EAR, WAR, JAR 的文件结构及区别
- 穿衣服的学问
- 遍历 XML 结构
- C++类的继承性和多态性
- SpringSide的Hibernate封装
- Pop Count Problem (二进制数中1的个数)
- eclipse.ini配置文件
- 深入浅出InfoPath——获取SharePoint群组中用户(无代码)
- 在cPanel空间安装SSL证书
- ORACLE PL/SQL实例精解笔记
- 软件测试生存法则:以人为本的策略
- HttpURLConnection用法详解
- 懒人活用JQuery.Autocomplete实现Select触发事件和结果定制