From a2d68e4fc5b7d64028bc20f6e9ad4fab7d1dcb97 Mon Sep 17 00:00:00 2001 From: Ben Alex Date: Wed, 6 Apr 2005 06:40:08 +0000 Subject: [PATCH] Hibernate 3 refactorings. --- domain/project.xml | 2 +- .../domain/hibernate/DaoHibernate.java | 52 ++++++++----------- .../IntrospectionManagerHibernate.java | 43 ++++++++++++--- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/domain/project.xml b/domain/project.xml index 7545053026..8925e9105a 100644 --- a/domain/project.xml +++ b/domain/project.xml @@ -15,7 +15,7 @@ hibernate hibernate - 2.1.8 + 3.0rc1 jar diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java index 25390ac7b1..80d59cbd83 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/DaoHibernate.java @@ -15,35 +15,32 @@ package net.sf.acegisecurity.domain.hibernate; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + import net.sf.acegisecurity.domain.PersistableEntity; import net.sf.acegisecurity.domain.dao.Dao; import net.sf.acegisecurity.domain.dao.EvictionCapable; import net.sf.acegisecurity.domain.dao.PaginatedList; -import net.sf.hibernate.Criteria; -import net.sf.hibernate.Hibernate; -import net.sf.hibernate.HibernateException; -import net.sf.hibernate.Session; -import net.sf.hibernate.expression.Expression; -import net.sf.hibernate.expression.MatchMode; -import net.sf.hibernate.expression.Order; -import net.sf.hibernate.metadata.ClassMetadata; -import net.sf.hibernate.type.Type; - -import org.springframework.orm.hibernate.HibernateCallback; -import org.springframework.orm.hibernate.HibernateObjectRetrievalFailureException; -import org.springframework.orm.hibernate.support.HibernateDaoSupport; - +import org.hibernate.Criteria; +import org.hibernate.EntityMode; +import org.hibernate.Hibernate; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.criterion.Expression; +import org.hibernate.criterion.MatchMode; +import org.hibernate.criterion.Order; +import org.hibernate.metadata.ClassMetadata; +import org.hibernate.type.Type; +import org.springframework.orm.hibernate3.HibernateCallback; +import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.util.Assert; -import java.io.Serializable; - -import java.util.Collection; -import java.util.List; - /** - * {@link Dao} implementation that uses Hibernate for persistence. + * {@link Dao} implementation that uses Hibernate 3 for persistence. * * @author Ben Alex * @author Matthew Porter @@ -103,13 +100,8 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, public PersistableEntity readId(Serializable id) { Assert.notNull(id); - - try { - return (PersistableEntity) getHibernateTemplate().load(supportsClass, - id); - } catch (HibernateObjectRetrievalFailureException notFound) { - return null; - } + + return (PersistableEntity) getHibernateTemplate().get(supportsClass, id); } public PaginatedList scroll(PersistableEntity value, int firstElement, @@ -215,7 +207,9 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, /* for each persistent property of the bean */ for (int i = 0; i < propertyNames.length; i++) { String name = propertyNames[i]; - Object value = classMetadata.getPropertyValue(bean, name); + + // TODO: Check if EntityMode.POJO appropriate + Object value = classMetadata.getPropertyValue(bean, name, EntityMode.POJO); if (value == null) { continue; @@ -231,7 +225,7 @@ public class DaoHibernate extends HibernateDaoSupport implements Dao, } // ignore any collections - if (propertyTypes[i].isPersistentCollectionType()) { + if (propertyTypes[i].isCollectionType()) { continue; } diff --git a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java index 83c763f6f3..6544c991a2 100644 --- a/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java +++ b/domain/src/main/java/org/acegisecurity/domain/hibernate/IntrospectionManagerHibernate.java @@ -16,18 +16,24 @@ package net.sf.acegisecurity.domain.hibernate; import net.sf.acegisecurity.domain.validation.IntrospectionManager; +import net.sf.acegisecurity.domain.validation.ValidationRegistryManager; -import net.sf.hibernate.HibernateException; -import net.sf.hibernate.SessionFactory; -import net.sf.hibernate.metadata.ClassMetadata; -import net.sf.hibernate.type.Type; +import org.hibernate.EntityMode; +import org.hibernate.HibernateException; +import org.hibernate.SessionFactory; + +import org.hibernate.metadata.ClassMetadata; + +import org.hibernate.type.Type; import org.springframework.beans.factory.InitializingBean; -import org.springframework.orm.hibernate.HibernateSystemException; +import org.springframework.orm.hibernate3.HibernateSystemException; import org.springframework.util.Assert; +import java.util.Collection; +import java.util.Iterator; import java.util.List; @@ -57,6 +63,7 @@ public class IntrospectionManagerHibernate implements IntrospectionManager, //~ Instance fields ======================================================== private SessionFactory sessionFactory; + private ValidationRegistryManager validationRegistryManager; //~ Methods ================================================================ @@ -68,8 +75,27 @@ public class IntrospectionManagerHibernate implements IntrospectionManager, return this.sessionFactory; } + public void setValidationRegistryManager( + ValidationRegistryManager validationRegistryManager) { + this.validationRegistryManager = validationRegistryManager; + } + + public ValidationRegistryManager getValidationRegistryManager() { + return validationRegistryManager; + } + public void afterPropertiesSet() throws Exception { + Assert.notNull(validationRegistryManager, + "ValidationRegistryManager is required"); Assert.notNull(sessionFactory, "SessionFactory is required"); + + // Eagerly pre-register Validators for all Hibernate metadata-defined classes + Collection mappedClasses = this.sessionFactory.getAllClassMetadata() + .keySet(); + + for (Iterator iter = mappedClasses.iterator(); iter.hasNext();) { + this.validationRegistryManager.findValidator((Class) iter.next()); + } } public void obtainImmediateChildren(Object parentObject, List allObjects) { @@ -90,9 +116,12 @@ public class IntrospectionManagerHibernate implements IntrospectionManager, for (int i = 0; i < propertyNames.length; i++) { Type propertyType = classMetadata.getPropertyType(propertyNames[i]); - if (propertyType.isObjectType()) { + // Add this property to the List of Objects to validate + // only if a Validator is registered for that Object + if (this.validationRegistryManager.findValidator( + propertyType.getReturnedClass()) != null) { allObjects.add(classMetadata.getPropertyValue( - parentObject, propertyNames[i])); + parentObject, propertyNames[i], EntityMode.POJO)); } } }