From: <hib...@li...> - 2006-03-07 14:24:19
|
Author: ste...@jb... Date: 2006-03-07 09:24:13 -0500 (Tue, 07 Mar 2006) New Revision: 9562 Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java Log: HHH-1531; plus other potential issues with property-ref Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 14:17:16 UTC (rev 9561) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/pretty/MessageHelper.java 2006-03-07 14:24:13 UTC (rev 9562) @@ -9,230 +9,313 @@ import org.hibernate.type.Type; /** - * Helper methods for rendering log messages and exception + * MessageHelper methods for rendering log messages relating to managed + * entities and collections typically used in log statements and exception * messages. + * * @author Max Andersen, Gavin King */ public final class MessageHelper { - private MessageHelper() {} + private MessageHelper() { + } + + // entities ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /** + * Generate an info message string relating to a particular entity, + * based on the given entityName and id. + * + * @param entityName The defined entity name. + * @param id The entity id value. + * @return An info string, in the form [FooBar#1]. + */ public static String infoString(String entityName, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(entityName==null) { - s.append("<null entity name>"); + s.append( '[' ); + if( entityName == null ) { + s.append( "<null entity name>" ); } else { - s.append(entityName); + s.append( entityName ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } - s.append(']'); + s.append( ']' ); return s.toString(); } /** - * Generate small message that can be used in traces and exception - * messages. - * @param persister The persister for the class in question - * @param id The id - * @return String on the form [FooBar#id] + * Generate an info message string relating to a particular entity. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param factory The session factory + * @return An info string, in the form [FooBar#1] */ public static String infoString( - EntityPersister persister, - Object id, - SessionFactoryImplementor factory - ) { + EntityPersister persister, + Object id, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + Type idType; + if( persister == null ) { + s.append( "<null EntityPersister>" ); + idType = null; } else { s.append( persister.getEntityName() ); + idType = persister.getIdentifierType(); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getIdentifierType().toLoggableString(id, factory) ); + if ( idType == null ) { + s.append( id ); + } + else { + s.append( idType.toLoggableString( id, factory ) ); + } } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a particular entity,. + * + * @param persister The persister for the entity + * @param id The entity id value + * @param identifierType The entity identifier type mapping + * @param factory The session factory + * @return An info string, in the form [FooBar#1] + */ public static String infoString( - EntityPersister persister, - Object id, + EntityPersister persister, + Object id, Type identifierType, - SessionFactoryImplementor factory - ) { + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( identifierType.toLoggableString(id, factory) ); + s.append( identifierType.toLoggableString( id, factory ) ); } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a series of entities. + * + * @param persister The persister for the entities + * @param ids The entity id values + * @param factory The session factory + * @return An info string, in the form [FooBar#<1,2,3>] + */ public static String infoString( - EntityPersister persister, - Serializable[] ids, - SessionFactoryImplementor factory - ) { + EntityPersister persister, + Serializable[] ids, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if( persister == null ) { + s.append( "<null EntityPersister>" ); } else { - s.append( persister.getEntityName() ) - .append("#<"); - + s.append( persister.getEntityName() ); + s.append( "#<" ); for ( int i=0; i<ids.length; i++ ) { s.append( persister.getIdentifierType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to given entity persister. + * + * @param persister The persister. + * @return An info string, in the form [FooBar] + */ public static String infoString(EntityPersister persister) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister == null) { - s.append("<null EntityPersister>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<null EntityPersister>" ); } else { s.append( persister.getEntityName() ); } - s.append(']'); + s.append( ']' ); return s.toString(); } + /** + * Generate an info message string relating to a given property value + * for an entity. + * + * @param entityName The entity name + * @param propertyName The name of the property + * @param key The property value. + * @return An info string, in the form [Foo.bars#1] + */ + public static String infoString(String entityName, String propertyName, Object key) { + StringBuffer s = new StringBuffer() + .append( '[' ) + .append( entityName ) + .append( '.' ) + .append( propertyName ) + .append( '#' ); + + if ( key == null ) { + s.append( "<null>" ); + } + else { + s.append( key ); + } + s.append( ']' ); + return s.toString(); + } + + + // collections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + /** + * Generate an info message string relating to a series of managed + * collections. + * + * @param persister The persister for the collections + * @param ids The id values of the owners + * @param factory The session factory + * @return An info string, in the form [Foo.bars#<1,2,3>] + */ public static String collectionInfoString( - CollectionPersister persister, - Serializable[] ids, - SessionFactoryImplementor factory - ) { + CollectionPersister persister, + Serializable[] ids, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if (persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { - s.append( persister.getRole() ) - .append("#<"); - - for ( int i=0; i<ids.length; i++ ) { - s.append( persister.getKeyType().toLoggableString( ids[i], factory ) ); - if ( i<ids.length-1 ) s.append(", "); + s.append( persister.getRole() ); + s.append( "#<" ); + for ( int i = 0; i < ids.length; i++ ) { + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( ids[i], factory ) ); + if ( i < ids.length-1 ) { + s.append( ", " ); + } } - s.append('>'); + s.append( '>' ); } - s.append(']'); - + s.append( ']' ); return s.toString(); + } - } - + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param persister The persister for the collection + * @param id The id value of the owner + * @param factory The session factory + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString( - CollectionPersister persister, - Serializable id, - SessionFactoryImplementor factory - ) { + CollectionPersister persister, + Serializable id, + SessionFactoryImplementor factory) { StringBuffer s = new StringBuffer(); - s.append('['); - if(persister==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if ( persister == null ) { + s.append( "<unreferenced>" ); } else { s.append( persister.getRole() ); - s.append('#'); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append( persister.getKeyType().toLoggableString(id, factory) ); + // Need to use the identifier type of the collection owner + // since the incoming is value is actually the owner's id. + // Using the collection's key type causes problems with + // property-ref keys... + s.append( persister.getOwnerEntityPersister().getIdentifierType().toLoggableString( id, factory ) ); } } - s.append(']'); + s.append( ']' ); return s.toString(); - } + /** + * Generate an info message string relating to a particular managed + * collection. + * + * @param role The role-name of the collection + * @param id The id value of the owner + * @return An info string, in the form [Foo.bars#1] + */ public static String collectionInfoString(String role, Serializable id) { StringBuffer s = new StringBuffer(); - s.append('['); - if(role==null) { - s.append("<unreferenced>"); + s.append( '[' ); + if( role == null ) { + s.append( "<unreferenced>" ); } else { - s.append(role); - s.append('#'); + s.append( role ); + s.append( '#' ); - if (id==null) { - s.append("<null>"); + if ( id == null ) { + s.append( "<null>" ); } else { - s.append(id); + s.append( id ); } } - s.append(']'); - + s.append( ']' ); return s.toString(); - } - public static String infoString(String entityName, String propertyName, Object key) { - StringBuffer s = new StringBuffer() - .append('[') - .append(entityName) - .append('.') - .append(propertyName) - .append('#'); - - if (key==null) { - s.append("<null>"); - } - else { - s.append(key); - } - s.append(']'); - - return s.toString(); - } - } Modified: branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java =================================================================== --- branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 14:17:16 UTC (rev 9561) +++ branches/Branch_3_1/Hibernate3/src/org/hibernate/type/CollectionType.java 2006-03-07 14:24:13 UTC (rev 9562) @@ -301,7 +301,13 @@ // later in the mapping document) - now, we could try and use e.getStatus() // to decide to semiResolve(), trouble is that initializeEntity() reuses // the same array for resolved and hydrated values - Object id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + Object id; + if ( entityEntry.getLoadedState() != null ) { + id = entityEntry.getLoadedValue( foreignKeyPropertyName ); + } + else { + id = entityEntry.getPersister().getPropertyValue( owner, foreignKeyPropertyName, session.getEntityMode() ); + } // NOTE VERY HACKISH WORKAROUND!! Type keyType = getPersister( session ).getKeyType(); |