Skip to content

Commit

Permalink
Progress migration to JPA 2.0 criteria API
Browse files Browse the repository at this point in the history
  • Loading branch information
graemerocher committed Nov 22, 2018
1 parent 3ac60b2 commit d40b16f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ import org.hibernate.transform.DistinctRootEntityResultTransformer
import org.springframework.core.convert.ConversionService
import org.springframework.transaction.PlatformTransactionManager

import javax.persistence.criteria.CriteriaBuilder
import javax.persistence.criteria.CriteriaQuery
import javax.persistence.criteria.Root
import java.util.regex.Pattern

/**
Expand All @@ -40,18 +43,35 @@ import java.util.regex.Pattern
abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> {

protected ProxyHandler proxyHandler
protected IHibernateTemplate hibernateTemplate
protected GrailsHibernateTemplate hibernateTemplate
protected ConversionService conversionService
protected final HibernateSession hibernateSession

AbstractHibernateGormStaticApi(Class<D> persistentClass, Datastore datastore, List<FinderMethod> finders, IHibernateTemplate hibernateTemplate) {
this(persistentClass, datastore, finders, null, hibernateTemplate)
AbstractHibernateGormStaticApi(
Class<D> persistentClass,
HibernateDatastore datastore,
List<FinderMethod> finders) {
this(persistentClass, datastore, finders, null)
}

AbstractHibernateGormStaticApi(Class<D> persistentClass, Datastore datastore, List<FinderMethod> finders, PlatformTransactionManager transactionManager, IHibernateTemplate hibernateTemplate) {
AbstractHibernateGormStaticApi(
Class<D> persistentClass,
HibernateDatastore datastore,
List<FinderMethod> finders,
PlatformTransactionManager transactionManager) {
super(persistentClass, datastore, finders, transactionManager)
this.hibernateTemplate = hibernateTemplate
this.hibernateTemplate = new GrailsHibernateTemplate(datastore.getSessionFactory(), datastore)
this.conversionService = datastore.mappingContext.conversionService
this.proxyHandler = datastore.mappingContext.proxyHandler
this.hibernateSession = new HibernateSession(
(HibernateDatastore)datastore,
hibernateTemplate.getSessionFactory(),
hibernateTemplate.getFlushMode()
)
}

IHibernateTemplate getHibernateTemplate() {
return hibernateTemplate
}

@Override
Expand Down Expand Up @@ -81,13 +101,18 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> {

if(persistentEntity.isMultiTenant()) {
// for multi-tenant entities we process get(..) via a query

(D)hibernateTemplate.execute( { Session session ->
def criteria = session.createCriteria(persistentEntity.javaClass)
criteria.add Restrictions.idEq(id)
firePreQueryEvent(session,criteria)
def result = (D) criteria.uniqueResult()
firePostQueryEvent(session, criteria, result)
return proxyHandler.unwrap( result )
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder()
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass)
Root queryRoot = criteriaQuery.from(persistentEntity.javaClass)
criteriaQuery = criteriaQuery.where (
criteriaBuilder.equal(queryRoot.get(persistentEntity.identity.name), id)
)
Query criteria = session.createQuery(criteriaQuery)
HibernateHqlQuery hibernateHqlQuery = new HibernateHqlQuery(
hibernateSession, persistentEntity, criteria)
return proxyHandler.unwrap( hibernateHqlQuery.singleResult() )
} )
}
else {
Expand Down Expand Up @@ -832,7 +857,7 @@ abstract class AbstractHibernateGormStaticApi<D> extends GormStaticApi<D> {
q.setReadOnly((Boolean)args.remove(DynamicFinder.ARGUMENT_READ_ONLY));
}
if (args.containsKey(DynamicFinder.ARGUMENT_FLUSH_MODE)) {
q.setFlushMode((FlushMode)args.remove(DynamicFinder.ARGUMENT_FLUSH_MODE));
q.setHibernateFlushMode((FlushMode)args.remove(DynamicFinder.ARGUMENT_FLUSH_MODE));
}

args.remove(DynamicFinder.ARGUMENT_CACHE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ class HibernateGormEnhancer extends GormEnhancer {
protected <D> GormStaticApi<D> getStaticApi(Class<D> cls, String qualifier) {
HibernateDatastore hibernateDatastore = (HibernateDatastore) datastore
HibernateDatastore datastoreForConnection = hibernateDatastore.getDatastoreForConnection(qualifier)
new HibernateGormStaticApi<D>(cls, datastoreForConnection, createDynamicFinders(datastoreForConnection), Thread.currentThread().contextClassLoader, datastoreForConnection.getTransactionManager())
new HibernateGormStaticApi<D>(
cls,
datastoreForConnection,
createDynamicFinders(datastoreForConnection),
Thread.currentThread().contextClassLoader,
datastoreForConnection.getTransactionManager()
)
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ import javax.persistence.criteria.Root
*/
@CompileStatic
class HibernateGormStaticApi<D> extends AbstractHibernateGormStaticApi<D> {
protected GrailsHibernateTemplate hibernateTemplate
protected SessionFactory sessionFactory
protected ConversionService conversionService
protected Class identityType
Expand All @@ -59,19 +58,21 @@ class HibernateGormStaticApi<D> extends AbstractHibernateGormStaticApi<D> {

HibernateGormStaticApi(Class<D> persistentClass, HibernateDatastore datastore, List<FinderMethod> finders,
ClassLoader classLoader, PlatformTransactionManager transactionManager) {
super(persistentClass, datastore, finders, transactionManager, null)
super(persistentClass, datastore, finders, transactionManager)
this.classLoader = classLoader
sessionFactory = datastore.getSessionFactory()
conversionService = datastore.mappingContext.conversionService

identityType = persistentEntity.identity?.type
hibernateTemplate = new GrailsHibernateTemplate(sessionFactory, datastore)
this.defaultFlushMode = datastore.getDefaultFlushMode()
super.hibernateTemplate = hibernateTemplate

instanceApi = new HibernateGormInstanceApi<>(persistentClass, datastore, classLoader)
}

@Override
GrailsHibernateTemplate getHibernateTemplate() {
return (GrailsHibernateTemplate)super.getHibernateTemplate()
}

@Override
List<D> list(Map params = Collections.emptyMap()) {
hibernateTemplate.execute { Session session ->
Expand Down

0 comments on commit d40b16f

Please sign in to comment.