SpringSide 的 hibernate的封装
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, params),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、fatchsize、cache、cacheRegion等多个查询参数,所以spring宁愿返回已设置好查询参数的Query和Criteria,让大家继续剩下的参数设置,最后再执行list(),注意那个几个参数是可以连续设置的。如:
createQuery(hql, param).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 name);
2、HibernateEntityDao
所以userManger、productManager之类只管理一类对象的Manager类的基类,只需要在类定义处声明entity类型即可。
public class BookManager extends HibernateEntityDao<Book>{};
通过<Book> 的定义,避免了HibernateGenericDao类个方法中必有的Class entityClass参数。
如果需要操作其它的entity,比如BookManager需要处理Category(图书目录),可以注入CategoryManager,无需担心事务的问题,javaEE默认的事务模型已经能很好的处理。
如果没有对应的CategoryManager,或各种原因不想注入的话,可以使用BookManager继承的HibernateGenericDao自带entityClass参数的函数来操作Category的CRUD,如Category category = this.get(Category.class, 1);
3、HibernateExtendsDao
此类演示SpringSide所做的一些扩展,大家可以根据自己的需求进行修改和扩展
1>、支持对象不能被直接删除,只能标示状态为无效列。
接口:UndeleteableEntityOperation,定义了支持此功能必须要实现的函数。
可以有接口(UndeleteableEntity) 和 annotation(@undeleteable) 两种形式来定义无效列,annotation列形式还可以定义标示对象已删除的状态的名称,用接口则必须实现setStatus()接口,在里面操作实际的状态属性。
两种方式的异同可见:侵入、非侵入 Interface vs Annotation
2>、重装save(); 在保存前先调用 onValid() 函数。
3>、增加find(Map map) 接口;
默认查找所有与map中条件全部相同的entity。
条件的比较运算符默认相同,用户也可以为属性名加上 like_, largerthen_这样的前缀,则使用相应的运算符做比较。
相关推荐
SpringSide的Hibernate封装是针对Spring和Hibernate整合时的一种优化实践,旨在提高开发效率和代码的可维护性。它通过三层封装来实现对Hibernate操作的便捷和类型安全。 第一层是HibernateGenericDao,它是基于...
其中,SpringSide 3对Hibernate的使用进行了深入的封装和优化,帮助开发者更好地理解和运用Hibernate的关联关系API。本文将围绕这一主题展开,详细探讨Hibernate的关联关系及其在SpringSide 3中的应用。 一、...
Hibernate,一个强大的对象关系映射(Object-Relational Mapping, ORM)框架,将复杂的SQL语句封装,使得开发者可以使用Java对象进行数据操作。在SpringSide中,Hibernate被用来处理数据库交互,通过定义对象实体和...
SpringSide将Spring的核心功能如依赖注入、AOP(面向切面编程)、事务管理、数据访问等进行了封装和优化,使得开发者可以更加专注于业务逻辑,而非底层实现细节。 在“springside-4.0.0.GA”压缩包中,我们可以期待...
每个模块都有明确的职责,比如Core模块提供了基础的配置和工具类,Console模块则包含了命令行工具,Security模块关注应用的安全性,Hibernate和MyBatis模块则分别针对ORM进行了封装。 5. **学习路径**: 对于初学...
2. **集成多种技术栈**:除了Spring核心框架外,SpringSide还支持如Struts、Hibernate、Spring Security等技术栈,提供了一站式的企业级应用开发解决方案。 3. **简化配置**:SpringSide对Spring框架的配置进行了...
- **业务逻辑层:** Springside3中Manager层主要用于封装具体的业务逻辑,通常包含了对多个实体的操作,如增删改查等。 - **示例代码:** ```java @Service @Transactional public class SecurityEntityManager ...
每个模块都封装了特定的功能,例如,Hibernate模块专注于数据库操作,MyBatis模块则处理SQL映射。 5. **最佳实践** SpringSide 4提供了一套经过实践验证的最佳实践,包括代码组织、命名规范、注释规则等,这有助于...
2、数据库访问层,此处已经采用了springside的封装方式,方法齐全,能充分满足数据库的大部分增删改查的需求 在做开发时,只需要简单的从genericmanager继承,进行泛型即可。分页也进行了简单的封装。具体方法请看...
5. **持久层框架**:SpringSide 4 可能会集成Hibernate或MyBatis等ORM框架,用于数据库操作。这些框架简化了JDBC的使用,使得数据库操作更加直观和高效。 6. **数据访问对象(DAO)和业务服务(Service)**:项目...
`compass.engine.connection:.hibernateGpsDevice:hibernateHibernate3`可能指代了使用Hibernate作为数据持久层的配置,Hibernate是一个提供对象关系映射(ORM)功能的框架,它能够将Java对象映射到关系型数据库中的表...