Java tutorial
// // Copyright 2009 Robin Komiwes, Bruno Verachten, Christophe Cordenier // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // package com.wooki.domain.dao; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.Date; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; import com.wooki.domain.model.WookiEntity; import com.wooki.services.db.QueryFilter; /** * This generic implementation of DAO will be the base for all wooki's DAO. * * @param <T> * @param <PK> */ public abstract class GenericDAOImpl<T extends WookiEntity, PK extends Serializable> implements GenericDAO<T, PK> { protected Session session; private Class<T> entityType; @SuppressWarnings("unchecked") public GenericDAOImpl(Session session) { this.session = session; this.entityType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; } public T create(T o) { this.session.persist(o); return o; } @SuppressWarnings("unchecked") public T update(T o) { final T result = (T) this.session.merge(o); return result; } public void delete(T o) { o.setDeletionDate(new Date()); this.session.merge(o); } public void refresh(T persistentObject) { this.session.refresh(persistentObject); } @SuppressWarnings("unchecked") public T findById(PK id) { assert id != null; Criteria crit = session.createCriteria(getEntityType()); crit.add(Restrictions.idEq(id)); return (T) crit.uniqueResult(); } public String getEntityType() { return entityType.getName(); } protected void setMaxResults(Query query, int max) { if (max > 0) { query.setMaxResults(max); } } public Criteria createCriteria() { return session.createCriteria(getEntityType()); } public Criteria createCriteria(String alias) { return session.createCriteria(getEntityType(), alias); } public Criteria createColumnCriteria(String col, Object value) { Criteria crit = this.session.createCriteria(getEntityType()); crit.add(Restrictions.eq(col, value)); return crit; } @SuppressWarnings("unchecked") public List<T> list(QueryFilter... filters) { Criteria crit = session.createCriteria(getEntityType()); crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); applyFilters(crit, filters); return (List<T>) crit.list(); } /** * This method can be called to apply a list of filter on the current query. * * @param crit * @param filters */ protected void applyFilters(Criteria crit, QueryFilter... filters) { if (filters != null) { for (QueryFilter f : filters) { f.filter(crit); } } } }