Created
December 18, 2009 10:21
-
-
Save billdozr/259421 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import com.myapp.core.persist.dao.GenericDao; | |
import com.myapp.core.persist.dao.finder.FinderArgumentTypeFactory; | |
import com.myapp.core.persist.dao.finder.FinderExecutor; | |
import com.myapp.core.persist.dao.finder.FinderNamingStrategy; | |
import com.myapp.core.persist.dao.finder.impl.SimpleFinderArgumentTypeFactory; | |
import com.myapp.core.persist.dao.finder.impl.SimpleFinderNamingStrategy; | |
import org.hibernate.Query; | |
import org.hibernate.Session; | |
import org.hibernate.SessionFactory; | |
import org.hibernate.type.Type; | |
import org.springframework.orm.hibernate3.SessionFactoryUtils; | |
import java.io.Serializable; | |
import java.lang.reflect.Method; | |
import java.util.Collection; | |
import java.util.Iterator; | |
import java.util.List; | |
/** | |
* Hibernate implementation of GenericDao | |
* A typesafe implementation of CRUD and finder methods based on Hibernate and Spring AOP | |
* The finders are implemented through the executeFinder method. Normally called by the | |
* FinderIntroductionInterceptor | |
*/ | |
public class GenericDaoHibernateImpl<T, PK extends Serializable> implements GenericDao<T, PK>, FinderExecutor { | |
private Session session; | |
private SessionFactory sessionFactory; | |
private FinderNamingStrategy namingStrategy = new SimpleFinderNamingStrategy(); // Default. Can override in config | |
private FinderArgumentTypeFactory argumentTypeFactory = new SimpleFinderArgumentTypeFactory(); // Default. Can override in config | |
private Class<T> type; | |
public GenericDaoHibernateImpl(Class<T> type) { | |
this.type = type; | |
} | |
public PK create(T o) { | |
return (PK) getSession().save(o); | |
} | |
public T read(PK id) { | |
return (T) getSession().get(type, id); | |
} | |
public void update(T o) { | |
getSession().update(o); | |
getSession().flush(); | |
} | |
public void delete(T o) { | |
getSession().delete(o); | |
} | |
public List<T> executeFinder(Method method, final Object[] queryArgs) { | |
final Query namedQuery = prepareQuery(method, queryArgs); | |
return (List<T>) namedQuery.list(); | |
} | |
public Iterator<T> iterateFinder(Method method, final Object[] queryArgs) { | |
final Query namedQuery = prepareQuery(method, queryArgs); | |
return (Iterator<T>) namedQuery.iterate(); | |
} | |
// public ScrollableResults scrollFinder(Method method, final Object[] queryArgs) | |
// { | |
// final Query namedQuery = prepareQuery(method, queryArgs); | |
// return (ScrollableResults) namedQuery.scroll(); | |
// } | |
private Query prepareQuery(Method method, Object[] queryArgs) { | |
final String queryName = getNamingStrategy().queryNameFromMethod(type, method); | |
final Query namedQuery = getSession().getNamedQuery(queryName); | |
String[] namedParameters = namedQuery.getNamedParameters(); | |
if (namedParameters.length == 0) { | |
setPositionalParams(queryArgs, namedQuery); | |
} else { | |
setNamedParams(namedParameters, queryArgs, namedQuery); | |
} | |
return namedQuery; | |
} | |
private void setPositionalParams(Object[] queryArgs, Query namedQuery) { | |
// Set parameter. Use custom Hibernate Type if necessary | |
if (queryArgs != null) { | |
for (int i = 0; i < queryArgs.length; i++) { | |
Object arg = queryArgs[i]; | |
Type argType = getArgumentTypeFactory().getArgumentType(arg); | |
if (argType != null) { | |
namedQuery.setParameter(i, arg, argType); | |
} else { | |
namedQuery.setParameter(i, arg); | |
} | |
} | |
} | |
} | |
private void setNamedParams(String[] namedParameters, Object[] queryArgs, Query namedQuery) { | |
// Set parameter. Use custom Hibernate Type if necessary | |
if (queryArgs != null) { | |
for (int i = 0; i < queryArgs.length; i++) { | |
Object arg = queryArgs[i]; | |
Type argType = getArgumentTypeFactory().getArgumentType(arg); | |
if (argType != null) { | |
namedQuery.setParameter(namedParameters[i], arg, argType); | |
} else { | |
if (arg instanceof Collection) { | |
namedQuery.setParameterList(namedParameters[i], (Collection) arg); | |
} else { | |
namedQuery.setParameter(namedParameters[i], arg); | |
} | |
} | |
} | |
} | |
} | |
public Session getSession() { | |
if (this.session != null) | |
return this.session; | |
boolean allowCreate = true; | |
this.session = SessionFactoryUtils.getSession(sessionFactory, allowCreate); | |
return this.session; | |
} | |
public void setSessionFactory(SessionFactory sessionFactory) { | |
this.sessionFactory = sessionFactory; | |
} | |
public FinderNamingStrategy getNamingStrategy() { | |
return namingStrategy; | |
} | |
public void setNamingStrategy(FinderNamingStrategy namingStrategy) { | |
this.namingStrategy = namingStrategy; | |
} | |
public FinderArgumentTypeFactory getArgumentTypeFactory() { | |
return argumentTypeFactory; | |
} | |
public void setArgumentTypeFactory(FinderArgumentTypeFactory argumentTypeFactory) { | |
this.argumentTypeFactory = argumentTypeFactory; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment