More fetching/initialization related fine-tuning.
This commit is contained in:
parent
4f2f6a5004
commit
307cd35b9c
|
@ -161,6 +161,35 @@ public interface Dao<E extends PersistableEntity> {
|
||||||
public PaginatedList<E> scroll(E value, int firstElement,
|
public PaginatedList<E> scroll(E value, int firstElement,
|
||||||
int maxElements, String orderByAsc);
|
int maxElements, String orderByAsc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find persistent instances with properties matching those of the passed
|
||||||
|
* <code>PersistableEntity</code>, with a guarantee the returned results
|
||||||
|
* will have each of the <code>value</code> class' immediate properties
|
||||||
|
* initialized.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Persistent instances are matched on the basis of query by example.
|
||||||
|
* Properties whose value is <code>null</code>, empty
|
||||||
|
* <code>String</code>s, and any <code>Collection</code>s are ignored in
|
||||||
|
* the query by example evaluation.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param value parameters to filter on (the class of this object will
|
||||||
|
* be added to the filter)
|
||||||
|
* @param firstElement the first result (start at zero to obtain all
|
||||||
|
* results)
|
||||||
|
* @param maxElements the maximum number of results desired for this page
|
||||||
|
* of the result set
|
||||||
|
* @param orderByAsc the property name of the
|
||||||
|
* <code>PersistableEntity</code> that should be used to order the
|
||||||
|
* results
|
||||||
|
*
|
||||||
|
* @return the requested page of the result list (a properly formed
|
||||||
|
* <code>PaginatedList</code> is returned if no results match)
|
||||||
|
*/
|
||||||
|
public PaginatedList<E> scrollPopulated(E value, int firstElement,
|
||||||
|
int maxElements, String orderByAsc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find persistent instances with properties matching those of the passed
|
* Find persistent instances with properties matching those of the passed
|
||||||
* <code>PersistableEntity</code>, ignoring the class of the passed
|
* <code>PersistableEntity</code>, ignoring the class of the passed
|
||||||
|
@ -183,6 +212,30 @@ public interface Dao<E extends PersistableEntity> {
|
||||||
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
||||||
int maxElements, String orderByAsc);
|
int maxElements, String orderByAsc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find persistent instances with properties matching those of the passed
|
||||||
|
* <code>PersistableEntity</code>, ignoring the class of the passed
|
||||||
|
* <code>PersistableEntity</code> (useful if you pass a superclass, as you
|
||||||
|
* want to find all subclass instances which match). Guarantees the returned
|
||||||
|
* results will have each of the DAO's <code>supports</code> class' immediate
|
||||||
|
* properties initialized.
|
||||||
|
*
|
||||||
|
* @param value parameters to filter on (the class of this object will
|
||||||
|
* NOT be added to the filter)
|
||||||
|
* @param firstElement the first result (start at zero to obtain all
|
||||||
|
* results)
|
||||||
|
* @param maxElements the maximum number of results desired for this page
|
||||||
|
* of the result set
|
||||||
|
* @param orderByAsc the property name of the
|
||||||
|
* <code>PersistableEntity</code> that should be used to order the
|
||||||
|
* results
|
||||||
|
*
|
||||||
|
* @return the requested page of the result list (a properly formed
|
||||||
|
* <code>PaginatedList</code> is returned if no results match)
|
||||||
|
*/
|
||||||
|
public PaginatedList<E> scrollPopulatedWithSubclasses(E value, int firstElement,
|
||||||
|
int maxElements, String orderByAsc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether the DAO instance provides persistence services for the
|
* Indicates whether the DAO instance provides persistence services for the
|
||||||
* specified class.
|
* specified class.
|
||||||
|
|
|
@ -72,4 +72,13 @@ public interface InitializationCapable {
|
||||||
* @param entity to initialize
|
* @param entity to initialize
|
||||||
*/
|
*/
|
||||||
public void initialize(Object entity);
|
public void initialize(Object entity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicaets whether the passed object is initialized or not.
|
||||||
|
*
|
||||||
|
* @param entity to determine if initialized
|
||||||
|
* @return <code>true</code> if initialized, <code>false</code> is uninitialized or
|
||||||
|
* the initialization status is unknown
|
||||||
|
*/
|
||||||
|
public boolean isInitialized(Object entity);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,21 @@ public class InitializationUtils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the passed entity has been initialized, by delegating
|
||||||
|
* to the passed daoOrServices (provided that the passed daoOrServices
|
||||||
|
* implements <code>InitializationCapable</code>.
|
||||||
|
*
|
||||||
|
* @param entity to determine whether initialized or not
|
||||||
|
* @return <code>true</code> if initialized, <code>false</code> if it is
|
||||||
|
* uninitialized or the passed daoOrServices does not provide
|
||||||
|
* initialization querying support
|
||||||
|
*/
|
||||||
|
public static boolean isInitialized(Object daoOrServices, Object entity) {
|
||||||
|
Assert.notNull(daoOrServices);
|
||||||
|
if (daoOrServices instanceof InitializationCapable) {
|
||||||
|
return ((InitializationCapable) daoOrServices).isInitialized(entity);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ import net.sf.acegisecurity.domain.validation.ValidationManager;
|
||||||
|
|
||||||
import org.hibernate.Criteria;
|
import org.hibernate.Criteria;
|
||||||
import org.hibernate.EntityMode;
|
import org.hibernate.EntityMode;
|
||||||
|
import org.hibernate.FetchMode;
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
|
@ -164,26 +165,39 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
|
||||||
|
|
||||||
public PaginatedList<E> scroll(E value, int firstElement,
|
public PaginatedList<E> scroll(E value, int firstElement,
|
||||||
int maxElements, String orderByAsc) {
|
int maxElements, String orderByAsc) {
|
||||||
Assert.notNull(value);
|
validateScrollMethod(value, firstElement, maxElements, orderByAsc);
|
||||||
Assert.hasText(orderByAsc,
|
|
||||||
"An orderByAsc is required (why not use your identity property?)");
|
|
||||||
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this DAO supports");
|
|
||||||
|
|
||||||
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
||||||
value.getClass(), value, firstElement, maxElements, Order.asc(orderByAsc)));
|
value.getClass(), false, value, firstElement, maxElements, Order.asc(orderByAsc)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
||||||
int maxElements, String orderByAsc) {
|
int maxElements, String orderByAsc) {
|
||||||
Assert.notNull(value);
|
validateScrollMethod(value, firstElement, maxElements, orderByAsc);
|
||||||
Assert.hasText(orderByAsc,
|
|
||||||
"An orderByAsc is required (why not use your identity property?)");
|
|
||||||
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this DAO supports");
|
|
||||||
|
|
||||||
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
||||||
this.supportsClass, value, firstElement, maxElements, Order.asc(orderByAsc)));
|
this.supportsClass, false, value, firstElement, maxElements, Order.asc(orderByAsc)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PaginatedList<E> scrollPopulated(E value, int firstElement,
|
||||||
|
int maxElements, String orderByAsc) {
|
||||||
|
validateScrollMethod(value, firstElement, maxElements, orderByAsc);
|
||||||
|
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
||||||
|
value.getClass(), true, value, firstElement, maxElements, Order.asc(orderByAsc)));
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaginatedList<E> scrollPopulatedWithSubclasses(E value, int firstElement,
|
||||||
|
int maxElements, String orderByAsc) {
|
||||||
|
validateScrollMethod(value, firstElement, maxElements, orderByAsc);
|
||||||
|
return (PaginatedList) getHibernateTemplate().execute(getFindByValueCallback(
|
||||||
|
this.supportsClass, true, value, firstElement, maxElements, Order.asc(orderByAsc)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateScrollMethod(E value, int firstElement, int MaxElements, String orderByAsc) {
|
||||||
|
Assert.notNull(value);
|
||||||
|
Assert.hasText(orderByAsc,
|
||||||
|
"An orderByAsc is required (why not use your identity property?)");
|
||||||
|
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this DAO supports");
|
||||||
|
}
|
||||||
|
|
||||||
public boolean supports(Class clazz) {
|
public boolean supports(Class clazz) {
|
||||||
Assert.notNull(clazz);
|
Assert.notNull(clazz);
|
||||||
|
|
||||||
|
@ -223,6 +237,10 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
|
||||||
Hibernate.initialize(entity);
|
Hibernate.initialize(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isInitialized(Object entity) {
|
||||||
|
return Hibernate.isInitialized(entity);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a <code>HibernateCallback</code> that will load a list of
|
* Provides a <code>HibernateCallback</code> that will load a list of
|
||||||
* objects by a <code>Collection</code> of identities.
|
* objects by a <code>Collection</code> of identities.
|
||||||
|
@ -256,6 +274,9 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
|
||||||
* the "version" name. If the property is mapped as String find a partial
|
* the "version" name. If the property is mapped as String find a partial
|
||||||
* match, otherwise find by exact match.
|
* match, otherwise find by exact match.
|
||||||
*
|
*
|
||||||
|
* @param whichClass the class (and subclasses) which results will be limited to including
|
||||||
|
* @param initializeAllProperties indicates whether lazy initialized properties
|
||||||
|
* should be initialized in the returned results
|
||||||
* @param bean bean with the values of the parameters
|
* @param bean bean with the values of the parameters
|
||||||
* @param firstElement the first result, numbered from 0
|
* @param firstElement the first result, numbered from 0
|
||||||
* @param count the maximum number of results
|
* @param count the maximum number of results
|
||||||
|
@ -263,7 +284,7 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
|
||||||
*
|
*
|
||||||
* @return a PaginatedList containing the requested objects
|
* @return a PaginatedList containing the requested objects
|
||||||
*/
|
*/
|
||||||
private HibernateCallback getFindByValueCallback(final Class whichClass, final Object bean,
|
private HibernateCallback getFindByValueCallback(final Class whichClass, final boolean initializeAllProperties, final Object bean,
|
||||||
final int firstElement, final int count, final Order order) {
|
final int firstElement, final int count, final Order order) {
|
||||||
return new HibernateCallback() {
|
return new HibernateCallback() {
|
||||||
public Object doInHibernate(Session session)
|
public Object doInHibernate(Session session)
|
||||||
|
@ -286,6 +307,11 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
|
||||||
for (int i = 0; i < propertyNames.length; i++) {
|
for (int i = 0; i < propertyNames.length; i++) {
|
||||||
String name = propertyNames[i];
|
String name = propertyNames[i];
|
||||||
|
|
||||||
|
// Indicate preferred fetching here
|
||||||
|
if (initializeAllProperties) {
|
||||||
|
criteria.setFetchMode(name, FetchMode.JOIN);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Check if EntityMode.POJO appropriate
|
// TODO: Check if EntityMode.POJO appropriate
|
||||||
Object value = classMetadata.getPropertyValue(bean, name, EntityMode.POJO);
|
Object value = classMetadata.getPropertyValue(bean, name, EntityMode.POJO);
|
||||||
|
|
||||||
|
|
|
@ -175,6 +175,32 @@ public interface Manager<E extends PersistableEntity> {
|
||||||
public PaginatedList<E> scroll(E value, int firstElement,
|
public PaginatedList<E> scroll(E value, int firstElement,
|
||||||
int maxElements);
|
int maxElements);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find persistent instances with properties matching those of the passed
|
||||||
|
* <code>PersistableEntity</code>, with a guarantee the returned results
|
||||||
|
* will have each of the <code>value</code> class' immediate properties
|
||||||
|
* initialized.
|
||||||
|
*
|
||||||
|
* <P>
|
||||||
|
* Persistent instances are matched on the basis of query by example.
|
||||||
|
* Properties whose value is <code>null</code>, empty
|
||||||
|
* <code>String</code>s, and any <code>Collection</code>s are ignored in
|
||||||
|
* the query by example evaluation.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param value parameters to filter on (the class of this object will
|
||||||
|
* be added to the filter)
|
||||||
|
* @param firstElement the first result (start at zero to obtain all
|
||||||
|
* results)
|
||||||
|
* @param maxElements the maximum number of results desired for this page
|
||||||
|
* of the result set
|
||||||
|
*
|
||||||
|
* @return the requested page of the result list (a properly formed
|
||||||
|
* <code>PaginatedList</code> is returned if no results match)
|
||||||
|
*/
|
||||||
|
public PaginatedList<E> scrollPopulated(E value, int firstElement,
|
||||||
|
int maxElements);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find persistent instances with properties matching those of the passed
|
* Find persistent instances with properties matching those of the passed
|
||||||
* <code>PersistableEntity</code>, ignoring the class of the passed
|
* <code>PersistableEntity</code>, ignoring the class of the passed
|
||||||
|
@ -194,6 +220,27 @@ public interface Manager<E extends PersistableEntity> {
|
||||||
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
||||||
int maxElements);
|
int maxElements);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find persistent instances with properties matching those of the passed
|
||||||
|
* <code>PersistableEntity</code>, ignoring the class of the passed
|
||||||
|
* <code>PersistableEntity</code> (useful if you pass a superclass, as you
|
||||||
|
* want to find all subclass instances which match). Guarantees the returned
|
||||||
|
* results will have each of the DAO's <code>supports</code> class' immediate
|
||||||
|
* properties initialized.
|
||||||
|
*
|
||||||
|
* @param value parameters to filter on (the class of this object will
|
||||||
|
* NOT be added to the filter)
|
||||||
|
* @param firstElement the first result (start at zero to obtain all
|
||||||
|
* results)
|
||||||
|
* @param maxElements the maximum number of results desired for this page
|
||||||
|
* of the result set
|
||||||
|
*
|
||||||
|
* @return the requested page of the result list (a properly formed
|
||||||
|
* <code>PaginatedList</code> is returned if no results match)
|
||||||
|
*/
|
||||||
|
public PaginatedList<E> scrollPopulatedWithSubclasses(E value, int firstElement,
|
||||||
|
int maxElements);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether the DAO instance provides persistence services for the
|
* Indicates whether the DAO instance provides persistence services for the
|
||||||
* specified class.
|
* specified class.
|
||||||
|
|
|
@ -136,7 +136,14 @@ public class ManagerImpl<E extends PersistableEntity> extends ApplicationObjectS
|
||||||
return dao.scroll(value, firstElement, maxElements, getDefaultSortOrder());
|
return dao.scroll(value, firstElement, maxElements, getDefaultSortOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
public PaginatedList<E> scrollPopulated(E value, int firstElement, int maxElements) {
|
||||||
|
Assert.notNull(value);
|
||||||
|
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this manager supports");
|
||||||
|
|
||||||
|
return dao.scrollPopulated(value, firstElement, maxElements, getDefaultSortOrder());
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaginatedList<E> scrollWithSubclasses(E value, int firstElement,
|
||||||
int maxElements) {
|
int maxElements) {
|
||||||
Assert.notNull(value);
|
Assert.notNull(value);
|
||||||
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this manager supports");
|
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this manager supports");
|
||||||
|
@ -144,6 +151,13 @@ public class ManagerImpl<E extends PersistableEntity> extends ApplicationObjectS
|
||||||
return dao.scrollWithSubclasses(value, firstElement, maxElements, getDefaultSortOrder());
|
return dao.scrollWithSubclasses(value, firstElement, maxElements, getDefaultSortOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PaginatedList<E> scrollPopulatedWithSubclasses(E value, int firstElement, int maxElements) {
|
||||||
|
Assert.notNull(value);
|
||||||
|
Assert.isInstanceOf(this.supportsClass, value, "Can only scroll with values this manager supports");
|
||||||
|
|
||||||
|
return dao.scrollPopulatedWithSubclasses(value, firstElement, maxElements, getDefaultSortOrder());
|
||||||
|
}
|
||||||
|
|
||||||
public boolean supports(Class clazz) {
|
public boolean supports(Class clazz) {
|
||||||
Assert.notNull(clazz);
|
Assert.notNull(clazz);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue