Add initialization support.

This commit is contained in:
Ben Alex 2005-05-12 06:06:20 +00:00
parent 0425724b4f
commit 5dcbb416ec
3 changed files with 102 additions and 2 deletions

View File

@ -0,0 +1,43 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.domain.dao;
/**
* Indicates an implementation capable of initializing an object, such that
* any lazy loading is guaranteed to have been completed.
*
* <p>
* Structured as a separate interface (rather than a subclass of
* <code>Dao</code>), as it is not required for all persistence strategies.
* </p>
*
* @author Ben Alex
* @version $Id$
*/
public interface InitializationCapable {
//~ Methods ================================================================
/**
* Initializes the indicated object.
*
* <p>
* May throw an exception if the implementation so desires.
* </p>
*
* @param entity to initialize
*/
public void initialize(Object entity);
}

View File

@ -0,0 +1,50 @@
/* Copyright 2004, 2005 Acegi Technology Pty Limited
*
* 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 net.sf.acegisecurity.domain.dao;
import org.springframework.util.Assert;
/**
* Convenience methods that support initialization of lazily loaded collections
* and associations using DAOs and other objects that implement
* {@link net.sf.acegisecurity.domain.dao.InitializationCapable}.
*
* @author Ben Alex
* @version $Id$
*/
public class InitializationUtils {
//~ Methods ================================================================
/**
* Initializes the passed entity using the passed
* DAO or services layer <code>Object</code> (provided that the passed
* <code>Object</code> implements <code>InitializationCapable</code>).
*
* @param daoOrServices the potential source for
* <code>InitializationCapable</code> services (never <code>null</code>)
* @param entity to evict (can be <code>null</code>)
*/
public static void initializeIfRequired(Object daoOrServices,
Object entity) {
Assert.notNull(daoOrServices);
if (daoOrServices instanceof InitializationCapable) {
((InitializationCapable) daoOrServices).initialize(entity);
}
}
}

View File

@ -22,6 +22,7 @@ import java.util.List;
import net.sf.acegisecurity.domain.PersistableEntity; import net.sf.acegisecurity.domain.PersistableEntity;
import net.sf.acegisecurity.domain.dao.Dao; import net.sf.acegisecurity.domain.dao.Dao;
import net.sf.acegisecurity.domain.dao.EvictionCapable; import net.sf.acegisecurity.domain.dao.EvictionCapable;
import net.sf.acegisecurity.domain.dao.InitializationCapable;
import net.sf.acegisecurity.domain.dao.PaginatedList; import net.sf.acegisecurity.domain.dao.PaginatedList;
import org.hibernate.Criteria; import org.hibernate.Criteria;
@ -46,7 +47,7 @@ import org.springframework.util.Assert;
* @version $Id$ * @version $Id$
*/ */
public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSupport implements Dao<E>, public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSupport implements Dao<E>,
EvictionCapable { EvictionCapable, InitializationCapable {
//~ Instance fields ======================================================== //~ Instance fields ========================================================
/** The class that this instance provides services for */ /** The class that this instance provides services for */
@ -158,6 +159,10 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
*/ */
protected void initHibernateDao() throws Exception {} protected void initHibernateDao() throws Exception {}
public void initialize(Object entity) {
Hibernate.initialize(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.
@ -211,6 +216,8 @@ public class DaoHibernate<E extends PersistableEntity> extends HibernateDaoSuppo
.getClassMetadata(bean .getClassMetadata(bean
.getClass()); .getClass());
Assert.notNull(classMetadata, "ClassMetadata for " + bean.getClass() + " unavailable from Hibernate - have you mapped this class against the SessionFactory?");
/* get persistent properties */ /* get persistent properties */
Type[] propertyTypes = classMetadata.getPropertyTypes(); Type[] propertyTypes = classMetadata.getPropertyTypes();
String[] propertyNames = classMetadata.getPropertyNames(); String[] propertyNames = classMetadata.getPropertyNames();