- 浏览: 187952 次
- 性别:
- 来自: 成都
-
最新评论
-
ls_autoction:
非常谢谢!:oops:
webservice注解 -
ganbo:
helloword
hibernate之openSession和getCurrentSession -
ganbo:
...
hibernate之openSession和getCurrentSession -
zizhengwang:
文章介绍的很全面,帮助我解决了问题,谢谢
hibernate之级联cascade和关系维持inverse -
yccn1984:
/** * 子类进行注入 * ...
DAO和Service公共抽象接口实现
DAO和Service公共抽象接口实现
1、分页帮助类
public class Page<T> { //-- 公共变量 --// public static final String ASC = "asc"; public static final String DESC = "desc"; //-- 分页参数 --// protected int pageNo = 1; protected int pageSize = -1; protected String orderBy = null; protected String order = null; protected boolean autoCount = true; //-- 返回结果 --// protected List<T> result = Lists.newArrayList(); protected long totalCount = -1; //-- 构造函数 --// public Page() { } public Page(int pageSize) { this.pageSize = pageSize; } //-- 分页参数访问函数 --// /** * 获得当前页的页号,序号从1开始,默认为1. */ public int getPageNo() { return pageNo; } /** * 设置当前页的页号,序号从1开始,低于1时自动调整为1. */ public void setPageNo(final int pageNo) { this.pageNo = pageNo; if (pageNo < 1) { this.pageNo = 1; } } /** * 返回Page对象自身的setPageNo函数,可用于连续设置。 */ public Page<T> pageNo(final int thePageNo) { setPageNo(thePageNo); return this; } /** * 获得每页的记录数量, 默认为-1. */ public int getPageSize() { return pageSize; } /** * 设置每页的记录数量. */ public void setPageSize(final int pageSize) { this.pageSize = pageSize; } /** * 返回Page对象自身的setPageSize函数,可用于连续设置。 */ public Page<T> pageSize(final int thePageSize) { setPageSize(thePageSize); return this; } /** * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始. */ public int getFirst() { return ((pageNo - 1) * pageSize) + 1; } /** * 获得排序字段,无默认值. 多个排序字段时用','分隔. */ public String getOrderBy() { return orderBy; } /** * 设置排序字段,多个排序字段时用','分隔. */ public void setOrderBy(final String orderBy) { this.orderBy = orderBy; } /** * 返回Page对象自身的setOrderBy函数,可用于连续设置。 */ public Page<T> orderBy(final String theOrderBy) { setOrderBy(theOrderBy); return this; } /** * 获得排序方向, 无默认值. */ public String getOrder() { return order; } /** * 设置排序方式向. * * @param order 可选值为desc或asc,多个排序字段时用','分隔. */ public void setOrder(final String order) { String lowcaseOrder = StringUtils.lowerCase(order); //检查order字符串的合法值 String[] orders = StringUtils.split(lowcaseOrder, ','); for (String orderStr : orders) { if (!StringUtils.equals(DESC, orderStr) && !StringUtils.equals(ASC, orderStr)) { throw new IllegalArgumentException("排序方向" + orderStr + "不是合法值"); } } this.order = lowcaseOrder; } /** * 返回Page对象自身的setOrder函数,可用于连续设置。 */ public Page<T> order(final String theOrder) { setOrder(theOrder); return this; } /** * 是否已设置排序字段,无默认值. */ public boolean isOrderBySetted() { return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(order)); } /** * 获得查询对象时是否先自动执行count查询获取总记录数, 默认为false. */ public boolean isAutoCount() { return autoCount; } /** * 设置查询对象时是否自动先执行count查询获取总记录数. */ public void setAutoCount(final boolean autoCount) { this.autoCount = autoCount; } /** * 返回Page对象自身的setAutoCount函数,可用于连续设置。 */ public Page<T> autoCount(final boolean theAutoCount) { setAutoCount(theAutoCount); return this; } //-- 访问查询结果函数 --// /** * 获得页内的记录列表. */ public List<T> getResult() { return result; } /** * 设置页内的记录列表. */ public void setResult(final List<T> result) { this.result = result; } /** * 获得总记录数, 默认值为-1. */ public long getTotalCount() { return totalCount; } /** * 设置总记录数. */ public void setTotalCount(final long totalCount) { this.totalCount = totalCount; } /** * 根据pageSize与totalCount计算总页数, 默认值为-1. */ public long getTotalPages() { if (totalCount < 0) { return -1; } long count = totalCount / pageSize; if (totalCount % pageSize > 0) { count++; } return count; } /** * 是否还有下一页. */ public boolean isHasNext() { return (pageNo + 1 <= getTotalPages()); } /** * 取得下页的页号, 序号从1开始. * 当前页为尾页时仍返回尾页序号. */ public int getNextPage() { if (isHasNext()) { return pageNo + 1; } else { return pageNo; } } /** * 是否还有上一页. */ public boolean isHasPre() { return (pageNo - 1 >= 1); } /** * 取得上页的页号, 序号从1开始. * 当前页为首页时返回首页序号. */ public int getPrePage() { if (isHasPre()) { return pageNo - 1; } else { return pageNo; } } }
2、session获取方式
public abstract class AbstractHibernateDaoSupport { protected Session getSession(){ return getSessionFactory().getCurrentSession(); } protected abstract SessionFactory getSessionFactory(); }
3、基础接口实现
public class BaseDaoImpl<Entity, PK extends Serializable> extends AbstractHibernateDaoSupport implements BaseDao<Entity, PK> { protected Logger logger = Logger.getLogger(getClass()); protected SessionFactory sessionFactory; protected Class<Entity> entityClass; /** * 用于Dao层子类使用的构造函数. 通过子类的泛型定义取得对象类型Class. eg. public class UserDao extends * SimpleHibernateDao<User, Long> */ public BaseDaoImpl() { this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass()); } /** * 用于用于省略Dao层, 在Service层直接使用通用SimpleHibernateDao的构造函数. 在构造函数中定义对象类型Class. * eg. SimpleHibernateDao<User, Long> userDao = new SimpleHibernateDao<User, * Long>(sessionFactory, User.class); */ public BaseDaoImpl(final SessionFactory sessionFactory, final Class<Entity> entityClass) { this.sessionFactory = sessionFactory; this.entityClass = entityClass; } /** * 取得sessionFactory. */ public SessionFactory getSessionFactory() { return sessionFactory; } /** * 采用@Autowired按类型注入SessionFactory, 当有多个SesionFactory的时候在子类重载本函数. */ @Resource public void setSessionFactory(final SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public Serializable save(Entity entity) { return this.getSession().save(entity); } public void update(Entity entity) { this.getSession().update(entity); } public void merge(Entity entity) { this.getSession().merge(entity); } public void refresh(Entity entity) { this.getSession().refresh(entity); } public void delete(final Entity entity) { this.getSession().delete(entity); } /** * 按id删除对象. */ public void delete(final PK id) { delete(findById(id)); } /** * 按id获取对象. */ @SuppressWarnings("unchecked") public Entity findById(final PK id) { return (Entity) getSession().get(entityClass, id); } /** * 按id列表获取对象列表. */ public List<Entity> findByIds(final Collection<PK> ids) { return find(Restrictions.in(getIdName(), ids)); } /** * 获取全部对象. */ public List<Entity> getAll() { return find(); } /** * 获取全部对象, 支持按属性行序. */ @SuppressWarnings("unchecked") public List<Entity> getAll(String orderByProperty, boolean isAsc) { Criteria c = createCriteria(); if (isAsc) { c.addOrder(Order.asc(orderByProperty)); } else { c.addOrder(Order.desc(orderByProperty)); } return c.list(); } /** * 按属性查找对象列表, 匹配方式为相等. */ public List<Entity> findByProperty(final String propertyName, final Object value) { Criterion criterion = Restrictions.eq(propertyName, value); return find(criterion); } /** * 按属性查找唯一对象, 匹配方式为相等. */ @SuppressWarnings("unchecked") public Entity findUniqueByProperty(final String propertyName, final Object value) { Criterion criterion = Restrictions.eq(propertyName, value); return (Entity) createCriteria(criterion).uniqueResult(); } /** * 按HQL查询对象列表. * * @param values * 数量可变的参数,按顺序绑定. */ @SuppressWarnings("unchecked") public <X> List<X> findByHql(final String hql, final Object... values) { return createQuery(hql, values).list(); } /** * 按HQL查询对象列表. * * @param values * 命名参数,按名称绑定. */ @SuppressWarnings("unchecked") public <X> List<X> findByHql(final String hql, final Map<String, ?> values) { return createQuery(hql, values).list(); } /** * 按HQL查询唯一对象. * * @param values * 数量可变的参数,按顺序绑定. */ @SuppressWarnings("unchecked") public <X> X findUniqueByHql(final String hql, final Object... values) { return (X) createQuery(hql, values).uniqueResult(); } /** * 按HQL查询唯一对象. * * @param values * 命名参数,按名称绑定. */ @SuppressWarnings("unchecked") public <X> X findUniqueByHql(final String hql, final Map<String, ?> values) { return (X) createQuery(hql, values).uniqueResult(); } /** * 执行HQL进行批量修改/删除操作. * * @param values * 数量可变的参数,按顺序绑定. * @return 更新记录数. */ public int batchExecute(final String hql, final Object... values) { return createQuery(hql, values).executeUpdate(); } /** * 执行HQL进行批量修改/删除操作. * * @param values * 命名参数,按名称绑定. * @return 更新记录数. */ public int batchExecute(final String hql, final Map<String, ?> values) { return createQuery(hql, values).executeUpdate(); } /** * 根据查询HQL与参数列表创建Query对象. 与find()函数可进行更加灵活的操作. * * @param values * 数量可变的参数,按顺序绑定. */ public Query createQuery(final String queryString, final Object... values) { Query query = getSession().createQuery(queryString); if (values != null) { for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } } return query; } /** * 根据查询HQL与参数列表创建Query对象. 与find()函数可进行更加灵活的操作. * * @param values * 命名参数,按名称绑定. */ public Query createQuery(final String queryString, final Map<String, ?> values) { Query query = getSession().createQuery(queryString); if (values != null) { query.setProperties(values); } return query; } /** * 按Criteria查询对象列表. * * @param criterions * 数量可变的Criterion. */ @SuppressWarnings("unchecked") public List<Entity> find(final Criterion... criterions) { return createCriteria(criterions).list(); } /** * 按Criteria查询唯一对象. * * @param criterions * 数量可变的Criterion. */ @SuppressWarnings("unchecked") public Entity findUnique(final Criterion... criterions) { return (Entity) createCriteria(criterions).uniqueResult(); } /** * 根据Criterion条件创建Criteria. 与find()函数可进行更加灵活的操作. * * @param criterions * 数量可变的Criterion. */ public Criteria createCriteria(final Criterion... criterions) { Criteria criteria = getSession().createCriteria(entityClass); for (Criterion c : criterions) { criteria.add(c); } return criteria; } /** * 初始化对象. 使用load()方法得到的仅是对象Proxy, 在传到View层前需要进行初始化. 如果传入entity, * 则只初始化entity的直接属性,但不会初始化延迟加载的关联集合和属性. 如需初始化关联属性,需执行: * Hibernate.initialize(user.getRoles()),初始化User的直接属性和关联集合. * Hibernate.initialize * (user.getDescription()),初始化User的直接属性和延迟加载的Description属性. */ public void initProxyObject(Object proxy) { Hibernate.initialize(proxy); } /** * Flush当前Session. */ public void flush() { getSession().flush(); } /** * 为Query添加distinct transformer. 预加载关联对象的HQL会引起主对象重复, 需要进行distinct处理. */ public Query distinct(Query query) { query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return query; } /** * 为Criteria添加distinct transformer. 预加载关联对象的HQL会引起主对象重复, 需要进行distinct处理. */ public Criteria distinct(Criteria criteria) { criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); return criteria; } /** * 取得对象的主键名. */ public String getIdName() { ClassMetadata meta = getSessionFactory().getClassMetadata(entityClass); return meta.getIdentifierPropertyName(); } /** * 判断对象的属性值在数据库内是否唯一. * * 在修改对象的情景下,如果属性新修改的值(value)等于属性原来的值(orgValue)则不作比较. */ public boolean isPropertyUnique(final String propertyName, final Object newValue, final Object oldValue) { if (newValue == null || newValue.equals(oldValue)) { return true; } Object object = findUniqueByProperty(propertyName, newValue); return (object == null); } public void saveOrUpdate(Entity entity) { this.getSession().saveOrUpdate(entity); } }
3、分页查询,复杂查询实现public class BaseEntityDaoImpl<Entity, PK extends Serializable> extends
BaseDaoImpl<Entity, PK> implements BaseEntityDao<Entity, PK> { /** * 用于Dao层子类的构造函数. 通过子类的泛型定义取得对象类型Class. eg. public class UserDao extends * HibernateDao<User, Long>{ } */ public BaseEntityDaoImpl() { super(); } public Page<Entity> findPage(final Page<Entity> page,final Criteria c){ if(page.isAutoCount()){ long totalCount = countCriteriaResult(c); page.setTotalCount(totalCount); } setPageParameterToCriteria(c, page); List result = c.list(); page.setResult(result); return page; } /** * 用于省略Dao层, Service层直接使用通用HibernateDao的构造函数. 在构造函数中定义对象类型Class. eg. * HibernateDao<User, Long> userDao = new HibernateDao<User, * Long>(sessionFactory, User.class); */ public BaseEntityDaoImpl(final SessionFactory sessionFactory, final Class<Entity> entityClass) { super(sessionFactory, entityClass); } // -- 分页查询函数 --// /** * 分页获取全部对象. */ public Page<Entity> findAllByPage(final Page<Entity> page) { return findPage(page); } /** * 按HQL分页查询. * * @param page * 分页参数. 注意不支持其中的orderBy参数. * @param hql * hql语句. * @param values * 数量可变的查询参数,按顺序绑定. * * @return 分页查询结果, 附带结果列表及所有查询输入参数. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Page<Entity> findPage(final Page<Entity> page, final String hql, final Object... values) { Query q = createQuery(hql, values); if (page.isAutoCount()) { long totalCount = countHqlResult(hql, values); page.setTotalCount(totalCount); } setPageParameterToQuery(q, page); List result = q.list(); page.setResult(result); return page; } /** * 按HQL分页查询. * * @param page * 分页参数. 注意不支持其中的orderBy参数. * @param hql * hql语句. * @param values * 命名参数,按名称绑定. * * @return 分页查询结果, 附带结果列表及所有查询输入参数. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Page<Entity> findPage(final Page<Entity> page, final String hql, final Map<String, ?> values) { Query q = createQuery(hql, values); if (page.isAutoCount()) { long totalCount = countHqlResult(hql, values); page.setTotalCount(totalCount); } setPageParameterToQuery(q, page); List result = q.list(); page.setResult(result); return page; } /** * 按Criteria分页查询. * * @param page * 分页参数. * @param criterions * 数量可变的Criterion. * * @return 分页查询结果.附带结果列表及所有查询输入参数. */ @SuppressWarnings({ "unchecked", "rawtypes" }) public Page<Entity> findPage(final Page<Entity> page, final Criterion... criterions) { Criteria c = createCriteria(criterions); if (page.isAutoCount()) { long totalCount = countCriteriaResult(c); page.setTotalCount(totalCount); } setPageParameterToCriteria(c, page); List result = c.list(); page.setResult(result); return page; } /** * 设置分页参数到Query对象,辅助函数. */ protected Query setPageParameterToQuery(final Query q, final Page<Entity> page) { // hibernate的firstResult的序号从0开始 q.setFirstResult(page.getFirst() - 1); q.setMaxResults(page.getPageSize()); return q; } /** * 设置分页参数到Criteria对象,辅助函数. */ protected Criteria setPageParameterToCriteria(final Criteria c, final Page<Entity> page) { // hibernate的firstResult的序号从0开始 c.setFirstResult(page.getFirst() - 1); c.setMaxResults(page.getPageSize()); if (page.isOrderBySetted()) { String[] orderByArray = StringUtils.split(page.getOrderBy(), ','); String[] orderArray = StringUtils.split(page.getOrder(), ','); for (int i = 0; i < orderByArray.length; i++) { if (Page.ASC.equals(orderArray[i])) { c.addOrder(Order.asc(orderByArray[i])); } else { c.addOrder(Order.desc(orderByArray[i])); } } } return c; } /** * 执行count查询获得本次Hql查询所能获得的对象总数. * * 本函数只能自动处理简单的hql语句,复杂的hql查询请另行编写count语句查询. */ protected long countHqlResult(final String hql, final Object... values) { String countHql = prepareCountHql(hql); try { Long count = findUniqueByHql(countHql, values); return count; } catch (Exception e) { throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e); } } /** * 执行count查询获得本次Hql查询所能获得的对象总数. * * 本函数只能自动处理简单的hql语句,复杂的hql查询请另行编写count语句查询. */ protected long countHqlResult(final String hql, final Map<String, ?> values) { String countHql = prepareCountHql(hql); try { Long count = findUniqueByHql(countHql, values); return count; } catch (Exception e) { throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e); } } private String prepareCountHql(String orgHql) { String fromHql = orgHql; // select子句与order by子句会影响count查询,进行简单的排除. fromHql = "from " + StringUtils.substringAfter(fromHql, "from"); fromHql = StringUtils.substringBefore(fromHql, "order by"); String countHql = "select count(*) " + fromHql; return countHql; } /** * 执行count查询获得本次Criteria查询所能获得的对象总数. */ @SuppressWarnings({ "unchecked", "rawtypes" }) protected long countCriteriaResult(final Criteria c) { CriteriaImpl impl = (CriteriaImpl) c; // 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作 Projection projection = impl.getProjection(); ResultTransformer transformer = impl.getResultTransformer(); List<CriteriaImpl.OrderEntry> orderEntries = null; try { orderEntries = (List) ReflectionUtils.getFieldValue(impl, "orderEntries"); ReflectionUtils .setFieldValue(impl, "orderEntries", new ArrayList()); } catch (Exception e) { logger.error("不可能抛出的异常:" + e.getMessage()); } // 执行Count查询 Long totalCountObject = (Long) c.setProjection(Projections.rowCount()) .uniqueResult(); long totalCount = (totalCountObject != null) ? totalCountObject : 0; // 将之前的Projection,ResultTransformer和OrderBy条件重新设回去 c.setProjection(projection); if (projection == null) { c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY); } if (transformer != null) { c.setResultTransformer(transformer); } try { ReflectionUtils.setFieldValue(impl, "orderEntries", orderEntries); } catch (Exception e) { logger.error("不可能抛出的异常:" + e.getMessage()); } return totalCount; } }
4、基础service实现,针对webservice
@Transactional public abstract class BaseServiceImpl<Entity extends DominObject, PK extends Serializable, EntityDao extends BaseEntityDao<Entity, PK>> implements BaseService<Entity, PK> { protected Logger log = Logger.getLogger(this.getClass()); protected EntityDao entityDao; public EntityDao getEntityDao() { return entityDao; } /** * 子类进行注入 * * @param entityDao */ public abstract void setEntityDao(EntityDao entityDao); public RetdObj<PK> delete(PK id) { RetdObj<PK> rt = new RetdObj<PK>(); try { this.entityDao.delete(id); rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(id); return rt; } catch (Exception ex) { log.error(ex.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } @Transactional(readOnly = true) public RetdObj<Page<Entity>> findAllByPage(Page<Entity> page) { RetdObj<Page<Entity>> rt = new RetdObj<Page<Entity>>(); try { page = this.entityDao.findAllByPage(page); if (page == null || page.getResult() == null || page.getResult().size() < 1) { rt.setCode(RetdCodeType.PASS_NODATA); return rt; } else { rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(page); return rt; } } catch (Exception ex) { log.error(ex.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } @Transactional(readOnly = true) public RetdObj<Entity> findById(PK id) { RetdObj<Entity> rt = new RetdObj<Entity>(); try { Entity entity = this.entityDao.findById(id); if (entity == null) { rt.setCode(RetdCodeType.PASS_NODATA); return rt; } else { rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(entity); return rt; } } catch (Exception ex) { log.error(ex.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } @Transactional(readOnly = true) public RetdObj<List<Entity>> findByIds(Collection<PK> ids) { RetdObj<List<Entity>> rt = new RetdObj<List<Entity>>(); try { List<Entity> entities = this.entityDao.findByIds(ids); if (entities == null || entities.size() < 1) { rt.setCode(RetdCodeType.PASS_NODATA); return rt; } else { rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(entities); return rt; } } catch (Exception ex) { log.error(ex.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } @Transactional(readOnly = true) public RetdObj<List<Entity>> getAll() { RetdObj<List<Entity>> rt = new RetdObj<List<Entity>>(); try { List<Entity> entities = this.entityDao.getAll(); if (entities == null || entities.size() < 1) { rt.setCode(RetdCodeType.PASS_NODATA); return rt; } else { rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(entities); return rt; } } catch (Exception ex) { log.error(ex.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } @SuppressWarnings("unchecked") public RetdObj<PK> save(Entity entity) { RetdObj<PK> rt = new RetdObj<PK>(); try { PK id = (PK) this.entityDao.save(entity); rt.setCode(RetdCodeType.PASS_OK); rt.setRealObj(id); return rt; } catch (Exception e) { log.error(e.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } public RetdObj<PK> update(Entity entity) { RetdObj<PK> rt = new RetdObj<PK>(); try { this.entityDao.update(entity); rt.setCode(RetdCodeType.PASS_OK); return rt; } catch (Exception e) { log.error(e.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } public RetdObj<PK> merge(Entity entity) { RetdObj<PK> rt = new RetdObj<PK>(); try { this.entityDao.merge(entity); rt.setCode(RetdCodeType.PASS_OK); return rt; } catch (Exception e) { log.error(e.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } public RetdObj<PK> refresh(Entity entity) { RetdObj<PK> rt = new RetdObj<PK>(); try { this.entityDao.refresh(entity); rt.setCode(RetdCodeType.PASS_OK); return rt; } catch (Exception e) { log.error(e.getMessage()); rt.setCode(RetdCodeType.EX_APP); return rt; } } }
6 、基础service,针对自用mvc
@Transactional public abstract class FrontBaseServiceImpl<Entity extends DominObject, PK extends Serializable, EntityDao extends BaseEntityDao<Entity, PK>> implements FrontBaseService<Entity, PK> { protected Logger log = Logger.getLogger(this.getClass()); protected EntityDao entityDao; public EntityDao getEntityDao() { return entityDao; } /** * 子类进行注入 * * @param entityDao */ public abstract void setEntityDao(EntityDao entityDao); @SuppressWarnings("unchecked") public PK save(Entity entity) { return (PK) this.entityDao.save(entity); } public void update(Entity entity) { this.entityDao.update(entity); } public void merge(Entity entity) { this.entityDao.merge(entity); } public void refresh(Entity entity) { this.entityDao.refresh(entity); } public void delete(PK id) { this.entityDao.delete(id); } @Transactional(readOnly = true) public Entity findById(PK id) { return this.entityDao.findById(id); } @Transactional(readOnly = true) public List<Entity> findByIds(Collection<PK> ids) { return this.entityDao.findByIds(ids); } @Transactional(readOnly = true) public List<Entity> getAll() { return this.entityDao.getAll(); } @Transactional(readOnly = true) public Page<Entity> findAllByPage(Page<Entity> page) { return this.entityDao.findAllByPage(page); } public void delete(PK[] ids) { for (PK id : ids) { this.delete(id); } } public void saveOrUpdate(Entity entity){ this.entityDao.saveOrUpdate(entity); } }
评论
2 楼
yccn1984
2014-05-14
/**
* 子类进行注入
*
* @param entityDao
*/
public abstract void setEntityDao(EntityDao entityDao);
具体的 Service 实现类 如何 注入 ,有没有实际的例子可以参考一下的。
* 子类进行注入
*
* @param entityDao
*/
public abstract void setEntityDao(EntityDao entityDao);
具体的 Service 实现类 如何 注入 ,有没有实际的例子可以参考一下的。
1 楼
yccn1984
2014-05-14
/**
* 子类进行注入
*
* @param entityDao
*/
public abstract void setEntityDao(EntityDao entityDao);
相关推荐
在Hibernate中,每个实体类通常对应一个DAO接口和其实现类。传统的做法是为每个实体类编写一套完整的CRUD方法,这无疑增加了大量重复的代码。为了解决这个问题,我们可以创建一个泛型DAO模板,该模板接受一个泛型...
实现DAO接口,并继承BaseDao: - 在`cn.公司名.项目名.dao.impl`包下创建实现类,类名为接口名加`Impl`,如`UserDaoImpl` - 继承`BaseDao`,并实现接口中声明的所有方法 - 对于增删改方法,需要拼接SQL语句并...
接下来,实现这个接口的抽象类`CommonDAO`,它包含了对Hibernate SessionFactory的引用以及一个构造方法,用于获取具体的实体类类型。`CommonDAO`提供了`SessionFactory`的getter和setter方法,以及一个构造器,通过...
在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在...它通过泛化的DAO接口和实现,减少了重复代码,增强了项目的结构化和模块化。这种设计模式在实际项目中非常常见,也是Java企业级开发的最佳实践之一。
- Service/DAO 层方法命名遵循特定模式,如 `get`、`list`、`count`、`save`、`remove` 和 `update`。 7. **变量定义**: - 常量按功能分类,如 `CacheConsts` 和 `ConfigConsts` 分别存储缓存和配置相关常量。 ...
通过实体类、DAO接口和服务接口等组件,可以实现对员工表的增删改查等操作。 ##### 测试代码 测试代码验证了对部门表和员工表的操作是否符合预期,确保了应用的正确性。 #### 条件查询+分页查询 条件查询指的是...
17. 多态实现:接口实现和继承实现,接口实现多态性更灵活,继承实现多态性基于类层次。 18. Java项目5层结构:通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data ...
首先,通用查询的设计往往基于面向对象编程的原则,通过抽象出一个公共的查询接口,实现对不同数据源的统一访问。这种设计可以极大地提高代码的复用性和可维护性。在实现时,可能会涉及到SQL语句的动态生成,根据...
1. 获取WSDL文件,理解服务的接口和消息格式。 2. 构造符合WSDL定义的SOAP请求消息。 3. 发送SOAP消息到服务端口。 4. 接收并处理服务返回的SOAP响应。 在Java中,可以使用JAX-WS(Java API for XML Web Services)...
- `service`层处理业务逻辑,对应服务接口和实现。 - `web`层处理前端交互,如JSP页面。 - `util`层包含通用工具类。 - `test`层包含单元测试代码,主要测试`service`层。 以上规范旨在提升代码质量和团队协作...
在Action类中,通过调用Service层的方法来处理业务,而Service层又会调用DAO层的方法来操作数据库。DAO层通常会使用Hibernate的Session接口进行数据库交互。 在Struts2的配置文件(struts.xml)中,需要定义Action...
11. 接口和实现类命名规则:实现类用Impl后缀与接口区分。 12. 推荐使用形容词+able后缀命名形容能力的接口。 编码风格规约: 1. 对于Service和DAO类,基于SOA的理念,公共接口应该是抽象的。 2. 枚举类名应添加...
- **封装**:封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式。它降低了系统的复杂性,提高了安全性。 - **抽象**:抽象是提取现实世界中的实体的共同特征,创建抽象类或接口。这使得代码更易于理解和...
通过这个支付系统源码,我们可以学习到如何利用Dubbo来设计和实现一个分布式系统,包括服务的拆分、接口定义、服务调用、异常处理、事务管理以及服务监控等方面的知识。同时,对于支付系统的具体业务流程,如订单...
在SSH整合中,Spring主要负责管理Bean的生命周期和事务控制,以及提供数据访问接口(DAO)的抽象。 1. **依赖注入**:Spring通过XML配置或注解方式实现对象间的依赖关系,降低耦合度。 2. **AOP**:Spring的AOP模块...
"org.greenscape.site.service:Site的服务层模块" 是一个与Java开发相关的项目,它主要关注的是服务层的设计和实现。在软件架构中,服务层通常是指业务逻辑层,负责处理应用程序的核心业务操作,为数据访问层和表现...
12. 类名后缀:根据分层架构,Action 类以 `Action` 结尾,实体类以 `Entity` 结尾,Service 接口以 `Service` 结尾,Dao 接口以 `Dao` 结尾,以明确其所属的层次和作用。 13. 事务处理:对于需要事务管理的方法,...
如果Controller间有共享逻辑,可以考虑提取至公共服务或抽象类。通过解耦和模块化设计,可以避免直接的Controller间调用,提高代码的可测试性和可维护性。 总之,虽然Spring Boot提供了Controller间调用的手段,但...
而"com.oyd.common.service"可能包含了一些公共服务层的接口和实现。 综上所述,Spring+Mybatis+Struts框架的组合,通过Spring的依赖注入和AOP增强服务,Mybatis的数据库操作抽象,以及Struts的视图控制,共同构建...