Java tutorial
/* * Copyright 2011 SURFnet bv, The Netherlands * * 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 nl.surfnet.coin.shared.service; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.hibernate.Criteria; import org.hibernate.SessionFactory; import org.hibernate.classic.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Example; import org.hibernate.criterion.Order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.support.DataAccessUtils; import org.springframework.transaction.annotation.Transactional; import nl.surfnet.coin.shared.domain.DomainObject; /** * GenericService based on hibernate * */ @Transactional public class GenericServiceHibernateImpl<T extends DomainObject> implements GenericService<T> { @Autowired private SessionFactory portalSessionFactory; /* * The domainObject class */ private Class<T> persistentClass; /** * Constructor * * @param type the clazz */ public GenericServiceHibernateImpl(Class<T> type) { this.persistentClass = type; } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#delete(nl.surfnet.coin.domain.DomainObject) */ @Override public void delete(T o) { portalSessionFactory.getCurrentSession().delete(o); } /* * (non-Javadoc) * * @see * nl.surfnet.coin.service.GenericService#detachFromSession(nl.surfnet.coin.domain.DomainObject) */ @Override public void detachFromSession(T o) { portalSessionFactory.getCurrentSession().evict(o); } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#findAll() */ @Override public List<T> findAll() { return findByCriteria(); } /* * (non-Javadoc) * * @see * nl.surfnet.coin.service.GenericService#findByExample(nl.surfnet.coin.domain.DomainObject) */ @Override public List<T> findByExample(T exampleInstance) { return findByExample(exampleInstance, new String[] {}); } /* * (non-Javadoc) * * @see * nl.surfnet.coin.service.GenericService#findByExample(nl.surfnet.coin.domain.DomainObject) */ @Override public List<T> findByExample(T exampleInstance, String[] excludes) { Example create = Example.create(exampleInstance); for (String name : excludes) { create.excludeProperty(name); } return findByCriteria(create); } /** * Convenience method for subclasses to find domain objects that match the Criterion's * * @param criterion array of {@link Criterion}'s * @return List of domain objects */ @SuppressWarnings("unchecked") protected List<T> findByCriteria(Criterion... criterion) { List<Criterion> criterionList = new ArrayList<Criterion>(criterion.length); Collections.addAll(criterionList, criterion); return findByCriteriaOrdered(criterionList, Collections.<Order>emptyList()); } /** * Convenicence method for subclasses to find domain objects that match the list of Criterion's in the given order * * @param criterionList List of {@link Criterion}'s * @param orderList List of {@link Order}'s * @return Sorted list of domain objects */ @SuppressWarnings("unchecked") protected List<T> findByCriteriaOrdered(List<Criterion> criterionList, List<Order> orderList) { Criteria crit = portalSessionFactory.getCurrentSession().createCriteria(getPersistentClass()); for (Criterion c : criterionList) { crit.add(c); } for (Order order : orderList) { crit.addOrder(order); } crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return crit.list(); } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#findById(java.lang.Long) */ @SuppressWarnings("unchecked") @Override public T findById(Long id) { return (T) portalSessionFactory.getCurrentSession().load(getPersistentClass(), id); } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#getCount() */ @Override public int getCount() { return DataAccessUtils.intResult(portalSessionFactory.getCurrentSession() .createQuery("select count(*) from " + getPersistentClass().getName()).list()); } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#getPersistentClass() */ @Override public Class<T> getPersistentClass() { return persistentClass; } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#saveOrUpdate(nl.surfnet.coin.domain.DomainObject) */ @Override public Long saveOrUpdate(T t) { portalSessionFactory.getCurrentSession().saveOrUpdate(t); return t.getId(); } /* * (non-Javadoc) * * @see nl.surfnet.coin.service.GenericService#saveOrUpdate(nl.surfnet.coin.domain.DomainObject) */ public void saveOrUpdate(Collection<T> coll) { for (T t : coll) { saveOrUpdate(t); } } /** * @return the portalSessionFactory */ protected Session getSession() { return portalSessionFactory.getCurrentSession(); } /* (non-Javadoc) * @see nl.surfnet.coin.portal.service.GenericService#createCriteria() */ @Override public Criteria createCriteria() { return portalSessionFactory.getCurrentSession().createCriteria(getPersistentClass()); } }