From: <one...@us...> - 2002-11-25 05:18:02
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister In directory sc8-pr-cvs1:/tmp/cvs-serv27042/hibernate/persister Modified Files: AbstractEntityPersister.java EntityPersister.java MultiTableEntityPersister.java Log Message: miscellaneous refactoring Index: AbstractEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/AbstractEntityPersister.java,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** AbstractEntityPersister.java 19 Nov 2002 10:42:17 -0000 1.14 --- AbstractEntityPersister.java 25 Nov 2002 05:18:00 -0000 1.15 *************** *** 5,8 **** --- 5,9 ---- import java.lang.reflect.Constructor; import java.lang.reflect.Method; + import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; *************** *** 26,29 **** --- 27,32 ---- import cirrus.hibernate.helpers.StringHelper; import cirrus.hibernate.id.IdentifierGenerator; + import cirrus.hibernate.id.NativeGenerator; + import cirrus.hibernate.map.Column; import cirrus.hibernate.map.PersistentClass; import cirrus.hibernate.map.Property; *************** *** 35,38 **** --- 38,42 ---- import cirrus.hibernate.sql.Dialect; import cirrus.hibernate.type.AbstractComponentType; + import cirrus.hibernate.type.IdentifierType; import cirrus.hibernate.type.Type; import cirrus.hibernate.type.TypeFactory; *************** *** 66,75 **** private transient final boolean hasCascades; private transient final boolean mutable; private transient final Class superclass; ! private transient final Class[] proxyInterfaces; private transient final Class concreteProxyClass; private transient final boolean hasProxy; private transient final boolean hasEmbeddedIdentifier; private transient final String identifierPropertyName; --- 70,90 ---- private transient final boolean hasCascades; private transient final boolean mutable; + private transient final boolean useIdentityColumn; private transient final Class superclass; ! ! private transient final String identitySelectString; ! private transient final Class[] proxyInterfaces; private transient final Class concreteProxyClass; private transient final boolean hasProxy; private transient final boolean hasEmbeddedIdentifier; + + private transient final String[] identifierColumnNames; + private transient final Cascades.IdentifierValue unsavedIdentifierValue; + + private transient final HashMap idTypesByPropertyPath = new HashMap(); + private transient final HashMap idColumnNamesByPropertyPath = new HashMap(); + protected transient final HashMap columnNamesByPropertyPath = new HashMap(); + protected transient final HashMap typesByPropertyPath = new HashMap(); private transient final String identifierPropertyName; *************** *** 83,86 **** --- 98,102 ---- private transient final String versionPropertyName; + private transient final String versionColumnName; private transient final VersionType versionType; private transient final Method getVersionMethod; *************** *** 142,146 **** int loc = path.indexOf("."); ! String componentPath = (loc>0) ? path.substring(loc+1) : ""; if ( getIdentifierType().isComponentType() ) { --- 158,162 ---- int loc = path.indexOf("."); ! String componentPath = path.substring(loc+1); if ( getIdentifierType().isComponentType() ) { *************** *** 179,186 **** ( idprop!=null && path.startsWith(idprop + '.') ) ) { ! return getIdentifierPropertyType( path.substring( PathExpressionParser.ENTITY_ID.length() ) ); } else { ! return null; } } --- 195,202 ---- ( idprop!=null && path.startsWith(idprop + '.') ) ) { ! return getIdentifierPropertyType( path.substring( PathExpressionParser.ENTITY_ID.length()+1 ) ); } else { ! return (Type) typesByPropertyPath.get(path); } } *************** *** 190,199 **** return cascadeStyles; } - - /** - * Given a component path expression, get the columns used to - * persist the composite identifier property - */ - protected abstract String[] getIdentifierPropertyColumnNames(String path); /** --- 206,209 ---- *************** *** 306,309 **** --- 316,323 ---- } + public String[] getIdentifierColumnNames() { + return identifierColumnNames; + } + public boolean isPolymorphic() { return polymorphic; *************** *** 314,317 **** --- 328,335 ---- } + public boolean hasCompositeKey() { + return identifierColumnNames.length>1; + } + public boolean hasCascades() { return hasCascades; *************** *** 341,344 **** --- 359,369 ---- } + public boolean isIdentifierAssignedByInsert() { + return useIdentityColumn; + } + + public boolean isUnsaved(Serializable id) { + return unsavedIdentifierValue.isUnsaved(id); + } public String[] getPropertyNames() { *************** *** 349,353 **** --- 374,392 ---- return identifierPropertyName; } + + public String getVersionColumnName() { + return versionColumnName; + } + public final String[] getIdentifierPropertyColumnNames(String path) { + return (String[]) idColumnNamesByPropertyPath.get(path); + } + public final Type getIdentifierPropertyType(String path) { + return (Type) idTypesByPropertyPath.get(path); + } + public final String[] getPropertyColumnNames(String path) { + return (String[]) columnNamesByPropertyPath.get(path); + } + public boolean implementsLifecycle() { return implementsLifecycle; *************** *** 382,385 **** --- 421,431 ---- } + /** + * The query that returns the generated identifier for an identity column + */ + protected final String sqlIdentitySelect() { + return identitySelectString; + } + public IdentifierGenerator getIdentifierGenerator() throws HibernateException { if (idgen==null) throw new HibernateException( *************** *** 455,459 **** ! // VERSION: if ( model.isVersioned() ) { --- 501,581 ---- ! // IDENTIFIER ! ! int idColumnSpan = model.getIdentifier().getColumnSpan(); ! identifierColumnNames = new String[idColumnSpan]; ! ! iter = idValue.getColumnIterator(); ! int i=0; ! while ( iter.hasNext() ) { ! Column col = (Column) iter.next(); ! identifierColumnNames[i] = col.getName(); ! i++; ! } ! ! ! if ( idValue.isComposite() ) { ! ! iter = ( (cirrus.hibernate.map.Component) idValue ).getPropertyIterator(); ! while ( iter.hasNext() ) { ! ! Property prop = (Property) iter.next(); ! idTypesByPropertyPath.put( prop.getName(), prop.getType() ); ! ! String[] cols = new String[ prop.getColumnSpan() ]; ! Iterator colIter= prop.getColumnIterator(); ! int j=0; ! while ( colIter.hasNext() ) { ! Column col = (Column) colIter.next(); ! cols[j++] = col.getName(); ! } ! ! idColumnNamesByPropertyPath.put( prop.getName(), cols ); ! if ( model.hasEmbeddedIdentifier() ) { ! columnNamesByPropertyPath.put( prop.getName(), cols ); ! typesByPropertyPath.put( prop.getName(), prop.getType() ); ! } ! ! } ! } ! ! ! IdentifierGenerator idgen = model.getIdentifier().getIdentifierGenerator(); ! useIdentityColumn = dialect.supportsIdentityColumns() && ( idgen instanceof NativeGenerator ); ! identitySelectString = (useIdentityColumn) ? dialect.getIdentitySelectString() : null; ! ! ! // UNSAVED-VALUE: ! ! String cts = model.getIdentifier().getNullValue(); ! if ( cts==null || "any".equals(cts) ) { ! unsavedIdentifierValue=Cascades.SAVE_ANY; ! } ! else if ( "none".equals(cts) ) { ! unsavedIdentifierValue=Cascades.SAVE_NONE; ! } ! else if ( "null".equals(cts) ) { ! unsavedIdentifierValue=Cascades.SAVE_NULL; ! } ! else { ! try { ! unsavedIdentifierValue = new Cascades.IdentifierValue( ( (IdentifierType) model.getIdentifier().getType() ).stringToObject(cts) ); ! } ! catch (ClassCastException cce) { ! throw new MappingException("Bad identifier type: " + model.getIdentifier().getType().getClass().getName() ); ! } ! catch (Exception e) { ! throw new MappingException("Could not parse unsaved-value: " + cts); ! } ! } ! ! // VERSION: ! ! if ( model.isVersioned() ) { ! versionColumnName = ( (Column) model.getVersion().getColumnIterator().next() ).getName(); ! } ! else { ! versionColumnName = null; ! } if ( model.isVersioned() ) { *************** *** 479,483 **** iter = model.getPropertyClosureIterator(); ! int i=0; int tempVersionProperty=-66; boolean foundCascade = false; --- 601,605 ---- iter = model.getPropertyClosureIterator(); ! i=0; int tempVersionProperty=-66; boolean foundCascade = false; Index: EntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/EntityPersister.java,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** EntityPersister.java 25 Nov 2002 02:21:09 -0000 1.40 --- EntityPersister.java 25 Nov 2002 05:18:00 -0000 1.41 *************** *** 4,9 **** import cirrus.hibernate.helpers.JDBCExceptionReporter; import cirrus.hibernate.helpers.StringHelper; - import cirrus.hibernate.id.IdentifierGenerator; - import cirrus.hibernate.id.NativeGenerator; import cirrus.hibernate.loader.EntityLoader; import cirrus.hibernate.loader.SimpleEntityLoader; --- 4,7 ---- *************** *** 41,47 **** import cirrus.hibernate.type.DiscriminatorType; import cirrus.hibernate.type.EntityType; - import cirrus.hibernate.type.IdentifierType; import cirrus.hibernate.type.Type; - import cirrus.hibernate.engine.Cascades; import cirrus.hibernate.engine.SessionFactoryImplementor; import cirrus.hibernate.engine.SessionImplementor; --- 39,43 ---- *************** *** 65,82 **** private transient final String updateString; private transient final String identityInsertString; - private transient final String identitySelectString; - private transient final String[] identifierColumnNames; - private transient final Cascades.IdentifierValue unsavedIdentifierValue; - private transient final int[] propertyColumnSpans; private transient final boolean[] definedOnSubclass; private transient final String[][] propertyColumnNames; private transient final String[][] subclassPropertyColumnNameClosure; ! ! private transient final boolean useIdentityColumn; ! private transient final String discriminatorColumnName; - private transient final String versionColumnName; private transient final String[] columnNames; private transient final String[] subclassColumnClosure; --- 61,71 ---- private transient final String updateString; private transient final String identityInsertString; private transient final int[] propertyColumnSpans; private transient final boolean[] definedOnSubclass; private transient final String[][] propertyColumnNames; private transient final String[][] subclassPropertyColumnNameClosure; ! private transient final String discriminatorColumnName; private transient final String[] columnNames; private transient final String[] subclassColumnClosure; *************** *** 86,97 **** private transient final int[] joinedFetch; ! private transient final HashMap subclassesByDiscriminatorValue; ! ! private transient final HashMap columnNamesByPropertyPath = new HashMap(); ! private transient final HashMap typesByPropertyPath = new HashMap(); ! ! private transient final HashMap idColumnNamesByPropertyPath = new HashMap(); ! private transient final HashMap idTypesByPropertyPath = new HashMap(); ! private transient final DiscriminatorType discriminatorType; private transient final Object discriminatorValue; --- 75,80 ---- private transient final int[] joinedFetch; ! private transient final HashMap subclassesByDiscriminatorValue = new HashMap(); ! private transient final DiscriminatorType discriminatorType; private transient final Object discriminatorValue; *************** *** 165,180 **** } - public String[] getIdentifierColumnNames() { - return identifierColumnNames; - } - public String getDiscriminatorColumnName() { return discriminatorColumnName; } - public boolean hasCompositeKey() { - return identifierColumnNames.length>1; - } - public int enableJoinedFetch(int i) { return joinedFetch[i]; --- 148,155 ---- *************** *** 194,212 **** return subclassPropertyTypeClosure.length; } - public Type getPropertyType(String path) { - Type idType = super.getPropertyType(path); - if (idType!=null) return idType; - - return (Type) typesByPropertyPath.get(path); - } - public Type getIdentifierPropertyType(String path) { - return (Type) idTypesByPropertyPath.get(path); - } - public String[] getIdentifierPropertyColumnNames(String path) { - return (String[]) idColumnNamesByPropertyPath.get(path); - } - public String[] getPropertyColumnNames(String path) { - return (String[]) columnNamesByPropertyPath.get(path); - } public String getTableName() { --- 169,172 ---- *************** *** 222,228 **** } - public boolean isIdentifierAssignedByInsert() { - return useIdentityColumn; - } public DiscriminatorType getDiscriminatorType() { return discriminatorType; --- 182,185 ---- *************** *** 241,248 **** } - public boolean isUnsaved(Serializable id) { - return unsavedIdentifierValue.isUnsaved(id); - } - public Serializable getIdentifierSpace() { return qualifiedTableName; --- 198,201 ---- *************** *** 256,266 **** /** - * The query that returns the generated identifier for an identity column - */ - protected final String sqlIdentitySelect() { - return identitySelectString; - } - - /** * The query that deletes a row by id (and version) */ --- 209,212 ---- *************** *** 299,307 **** .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", identifierColumnNames ) ) .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?") ; } --- 245,253 ---- .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?") ; } *************** *** 324,328 **** .append( cirrus.hibernate.helpers.StringHelper.join( ", ", columnNames ) ) .append(commaAfterProperties) ! .append( insertIdentifierColumns ? StringHelper.join( ", ", identifierColumnNames ) : "" ) .append(commaAfterIdentifiers) .append( isPolymorphic() ? getDiscriminatorColumnName() : "" ) //to handle discriminator column --- 270,274 ---- .append( cirrus.hibernate.helpers.StringHelper.join( ", ", columnNames ) ) .append(commaAfterProperties) ! .append( insertIdentifierColumns ? StringHelper.join( ", ", getIdentifierColumnNames() ) : "" ) .append(commaAfterIdentifiers) .append( isPolymorphic() ? getDiscriminatorColumnName() : "" ) //to handle discriminator column *************** *** 332,336 **** .append(commaAfterProperties); if ( !identityInsert ) { ! buf.append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) .append("?"); } --- 278,282 ---- .append(commaAfterProperties); if ( !identityInsert ) { ! buf.append( StringHelper.repeat( "?, ", getIdentifierColumnNames().length-1 ) ) .append("?"); } *************** *** 363,367 **** return new StringBuffer(100) .append("select ") ! .append( StringHelper.join( ", ", identifierColumnNames ) ) .append( hasSubclasses() ? ", " + getDiscriminatorColumnName() : "" ) .append( subclassColumnClosure.length==0 ? "" : ", ") --- 309,313 ---- return new StringBuffer(100) .append("select ") ! .append( StringHelper.join( ", ", getIdentifierColumnNames() ) ) .append( hasSubclasses() ? ", " + getDiscriminatorColumnName() : "" ) .append( subclassColumnClosure.length==0 ? "" : ", ") *************** *** 370,374 **** .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", identifierColumnNames ) ) .append(" = ?") .toString(); --- 316,320 ---- .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) .append(" = ?") .toString(); *************** *** 390,398 **** .append( setters.toString() ) .append(" where ") ! .append( StringHelper.join( " = ? and ", identifierColumnNames ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?"); } --- 336,344 ---- .append( setters.toString() ) .append(" where ") ! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?"); } *************** *** 406,418 **** StringBuffer buf = new StringBuffer(100) .append("select ") ! .append( identifierColumnNames[0] ) .append(" from ") .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", identifierColumnNames ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?"); } --- 352,364 ---- StringBuffer buf = new StringBuffer(100) .append("select ") ! .append( getIdentifierColumnNames()[0] ) .append(" from ") .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?"); } *************** *** 435,439 **** if ( id!=null ) { getIdentifierType().nullSafeSet( st, id, index, session ); ! index += identifierColumnNames.length; } --- 381,385 ---- if ( id!=null ) { getIdentifierType().nullSafeSet( st, id, index, session ); ! index += getIdentifierColumnNames().length; } *************** *** 607,611 **** if ( isVersioned() ) { ! getVersionType().nullSafeSet( statement, version, identifierColumnNames.length + 1, session ); check( statement.executeUpdate(), id ); } --- 553,557 ---- if ( isVersioned() ) { ! getVersionType().nullSafeSet( statement, version, getIdentifierColumnNames().length + 1, session ); check( statement.executeUpdate(), id ); } *************** *** 686,776 **** tableNames = new String[] { qualifiedTableName }; - // IDENTIFIER - - int idColumnSpan = model.getIdentifier().getColumnSpan(); - identifierColumnNames = new String[idColumnSpan]; - - Value idValue = model.getIdentifier(); - - Iterator iter = idValue.getColumnIterator(); - int i=0; - while ( iter.hasNext() ) { - Column col = (Column) iter.next(); - identifierColumnNames[i] = col.getName(); - i++; - } - - - if ( idValue.isComposite() ) { - - iter = ( (cirrus.hibernate.map.Component) idValue ).getPropertyIterator(); - while ( iter.hasNext() ) { - - Property prop = (Property) iter.next(); - idTypesByPropertyPath.put( prop.getName(), prop.getType() ); - - String[] cols = new String[ prop.getColumnSpan() ]; - Iterator colIter= prop.getColumnIterator(); - int j=0; - while ( colIter.hasNext() ) { - Column col = (Column) colIter.next(); - cols[j++] = col.getName(); - } - - idColumnNamesByPropertyPath.put( prop.getName(), cols ); - if ( model.hasEmbeddedIdentifier() ) { - columnNamesByPropertyPath.put( prop.getName(), cols ); - typesByPropertyPath.put( prop.getName(), prop.getType() ); - } - - } - } - - - final String identityColumnInsertString; - IdentifierGenerator idgen = model.getIdentifier().getIdentifierGenerator(); - useIdentityColumn = dialect.supportsIdentityColumns() && ( idgen instanceof NativeGenerator ); - if (useIdentityColumn) { - identitySelectString = dialect.getIdentitySelectString(); - identityColumnInsertString = dialect.getIdentityInsertString(); - } - else { - identitySelectString = null; - identityColumnInsertString = null; - } - - // UNSAVED-VALUE: - - String cts = model.getIdentifier().getNullValue(); - if ( cts==null || "any".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_ANY; - } - else if ( "none".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_NONE; - } - else if ( "null".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_NULL; - } - else { - try { - unsavedIdentifierValue = new Cascades.IdentifierValue( ( (IdentifierType) model.getIdentifier().getType() ).stringToObject(cts) ); - } - catch (ClassCastException cce) { - throw new MappingException("Bad identifier type: " + model.getIdentifier().getType().getClass().getName() ); - } - catch (Exception e) { - throw new MappingException("Could not parse unsaved-value: " + cts); - } - } - - // VERSION: - - if ( model.isVersioned() ) { - versionColumnName = ( (Column) model.getVersion().getColumnIterator().next() ).getName(); - } - else { - versionColumnName = null; - } - // DISCRIMINATOR --- 632,635 ---- *************** *** 805,810 **** HashSet thisClassProperties = new HashSet(); ! iter = model.getPropertyClosureIterator(); ! i=0; while( iter.hasNext() ) { --- 664,669 ---- HashSet thisClassProperties = new HashSet(); ! Iterator iter = model.getPropertyClosureIterator(); ! int i=0; while( iter.hasNext() ) { *************** *** 873,877 **** deleteString = generateDeleteString(); insertString = generateInsertString(false, null); ! identityInsertString = useIdentityColumn ? generateInsertString(true, identityColumnInsertString) : null; updateString = generateUpdateString(); --- 732,736 ---- deleteString = generateDeleteString(); insertString = generateInsertString(false, null); ! identityInsertString = isIdentifierAssignedByInsert() ? generateInsertString( true, dialect.getIdentityInsertString() ) : null; updateString = generateUpdateString(); *************** *** 887,897 **** subclassClosure = new Class[subclassSpan]; subclassClosure[0] = mappedClass; ! if ( model.isPolymorphic() ) { ! subclassesByDiscriminatorValue = new HashMap(); ! subclassesByDiscriminatorValue.put( discriminatorValue, mappedClass ); ! } ! else { ! subclassesByDiscriminatorValue = null; ! } // SUBCLASSES --- 746,750 ---- subclassClosure = new Class[subclassSpan]; subclassClosure[0] = mappedClass; ! if ( model.isPolymorphic() ) subclassesByDiscriminatorValue.put( discriminatorValue, mappedClass ); // SUBCLASSES Index: MultiTableEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/MultiTableEntityPersister.java,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -d -r1.35 -r1.36 *** MultiTableEntityPersister.java 25 Nov 2002 02:21:10 -0000 1.35 --- MultiTableEntityPersister.java 25 Nov 2002 05:18:00 -0000 1.36 *************** *** 5,10 **** import cirrus.hibernate.helpers.JDBCExceptionReporter; import cirrus.hibernate.helpers.StringHelper; - import cirrus.hibernate.id.IdentifierGenerator; - import cirrus.hibernate.id.NativeGenerator; import cirrus.hibernate.loader.EntityLoader; import cirrus.hibernate.loader.OuterJoinGenerator; --- 5,8 ---- *************** *** 16,20 **** import cirrus.hibernate.map.Subclass; import cirrus.hibernate.map.Table; - import cirrus.hibernate.map.Value; import java.io.InvalidObjectException; --- 14,17 ---- *************** *** 44,50 **** import cirrus.hibernate.type.DiscriminatorType; import cirrus.hibernate.type.EntityType; - import cirrus.hibernate.type.IdentifierType; import cirrus.hibernate.type.Type; - import cirrus.hibernate.engine.Cascades; import cirrus.hibernate.engine.SessionFactoryImplementor; import cirrus.hibernate.engine.SessionImplementor; --- 41,45 ---- *************** *** 71,81 **** private transient final String[] identityInsertStrings; private transient final String[] updateStrings; - private transient final String identitySelectString; - private transient final boolean useIdentityColumn; - - private transient final String[] identifierColumnNames; - private transient final Cascades.IdentifierValue unsavedIdentifierValue; - private transient final int[] joinedFetch; private transient final int[] propertyColumnSpans; --- 66,70 ---- *************** *** 88,94 **** private transient final int[] subclassPropertyTableNumberClosure; - private transient final String discriminatorColumnName; - private transient final String versionColumnName; - private transient final String[] columnNames; private transient final String[] subclassColumnClosure; --- 77,80 ---- *************** *** 100,117 **** private transient final HashMap tableNumberByPropertyPath = new HashMap(); ! private transient final HashMap subclassesByDiscriminatorValue; private transient final String[] discriminators; private transient final String[] notNullColumns; private transient final int[] tableNumbers; - - private transient final HashMap columnNamesByPropertyPath = new HashMap(); - private transient final HashMap typesByPropertyPath = new HashMap(); - - private transient final HashMap idColumnNamesByPropertyPath = new HashMap(); - private transient final HashMap idTypesByPropertyPath = new HashMap(); private transient final DiscriminatorType discriminatorType; private transient final Object discriminatorValue; private transient final String discriminatorSQLString; protected transient UniqueEntityLoader loader; --- 86,98 ---- private transient final HashMap tableNumberByPropertyPath = new HashMap(); ! private transient final HashMap subclassesByDiscriminatorValue = new HashMap(); private transient final String[] discriminators; private transient final String[] notNullColumns; private transient final int[] tableNumbers; private transient final DiscriminatorType discriminatorType; private transient final Object discriminatorValue; private transient final String discriminatorSQLString; + private transient final String discriminatorColumnName; protected transient UniqueEntityLoader loader; *************** *** 164,170 **** return definedOnSubclass[i]; } ! ! public String[] getIdentifierColumnNames() { ! return identifierColumnNames; } --- 145,151 ---- return definedOnSubclass[i]; } ! ! public String getTableName() { ! return qualifiedTableName; } *************** *** 172,180 **** return discriminatorColumnName; } ! ! public boolean hasCompositeKey() { ! return identifierColumnNames.length>1; ! } ! public String[] getSubclassColumnClosure() { return subclassColumnClosure; --- 153,157 ---- return discriminatorColumnName; } ! public String[] getSubclassColumnClosure() { return subclassColumnClosure; *************** *** 186,206 **** return subclassPropertyTypeClosure.length; } - public Type getPropertyType(String path) { - Type idType = super.getPropertyType(path); - if (idType!=null) return idType; - - return (Type) typesByPropertyPath.get(path); - } - public Type getIdentifierPropertyType(String path) { - return (Type) idTypesByPropertyPath.get(path); - } - public String[] getPropertyColumnNames(String path) { - return (String[]) columnNamesByPropertyPath.get(path); - } - - - public String getTableName() { - return qualifiedTableName; - } public String[] getSubclassPropertyColumnNames(int i) { --- 163,166 ---- *************** *** 212,218 **** } - public String[] getIdentifierPropertyColumnNames(String path) { - return (String[]) idColumnNamesByPropertyPath.get(path); - } public DiscriminatorType getDiscriminatorType() { return discriminatorType; --- 172,175 ---- *************** *** 235,246 **** } - public boolean isIdentifierAssignedByInsert() { - return useIdentityColumn; - } - - public boolean isUnsaved(Serializable id) { - return unsavedIdentifierValue.isUnsaved(id); - } - public Serializable getIdentifierSpace() { return qualifiedTableName; --- 192,195 ---- *************** *** 254,264 **** /** - * The query that returns the generated identifier for an identity column - */ - protected final String sqlIdentitySelect() { - return identitySelectString; - } - - /** * The query that deletes a row by id (and version) */ --- 203,206 ---- *************** *** 303,307 **** if ( isVersioned() && i==0 ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?") ; } --- 245,249 ---- if ( isVersioned() && i==0 ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?") ; } *************** *** 351,355 **** } else if (insertIdentifierColumns) { ! buf.append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) .append("?"); } --- 293,297 ---- } else if (insertIdentifierColumns) { ! buf.append( StringHelper.repeat( "?, ", getIdentifierColumnNames().length-1 ) ) .append("?"); } *************** *** 365,442 **** /** - * Generate the SQL that selects a row by id using <tt>FOR UPDATE</tt> - */ - protected String generateSelectForUpdateString() { - return generateSelectString() + " for update"; - } - - /** - * Generate the SQL that selects a row by id using <tt>FOR UPDATE</tt> - */ - protected String generateSelectForUpdateNowaitString() { - return generateSelectString() + " for update nowait"; - } - - /** - * Generate the SQL that selects a row by id - */ - protected String generateSelectString() { - - String[] tables = subclassTableNameClosure; - - StringBuffer buf = new StringBuffer(100) - .append("select ") - .append(tables[0] + '.') - .append( StringHelper.join( ", " + tables[0] + '.', identifierColumnNames ) ); - - if ( hasSubclasses() ) { - buf.append(", case"); - for ( int i=0; i< discriminators.length; i++ ) { - buf.append(" when ") - .append( tables[ tableNumbers[i] ] ) - .append('.') - .append( notNullColumns[i] ) - .append(" is not null then ") - .append( discriminators[i] ); - } - buf.append(" end as ") - .append( getDiscriminatorColumnName() ); - } - - buf.append( subclassColumnClosure.length==0 ? "" : ", "); - for ( int i=0; i<subclassColumnClosure.length; i++ ) { - buf.append( subclassTableNameClosure[ subclassColumnTableNumberClosure[i] ] ) - .append('.') - .append( subclassColumnClosure[i] ) - .append(" as ") - .append( subclassColumnClosureAliases[i] ); - if (i<subclassColumnClosure.length-1) buf.append(", "); - } - buf.append(" from ").append( tables[0] ); - for ( int i=1; i<tables.length; i++ ) { - buf.append(" left outer join ") - .append( tables[i] ) - .append(" on "); - for ( int j=0; j<identifierColumnNames.length; j++ ) { - buf.append( tables[0] ) - .append('.') - .append( identifierColumnNames[j] ) - .append('=') - .append( tables[i] ) - .append('.') - .append( subclassTableKeyColumns[i][j] ); - if (j!=identifierColumnNames.length-1) buf.append(" and "); - } - } - buf.append(" where ") - .append(tables[0] + '.') - .append( StringHelper.join( " = ? and " + tables[0] + '.', identifierColumnNames ) ) - .append(" = ?"); - - - return buf.toString(); - } - - /** * Generate the SQL that updates a row by id (and version) */ --- 307,310 ---- *************** *** 469,473 **** if ( isVersioned() && j==0 ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?"); } --- 337,341 ---- if ( isVersioned() && j==0 ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?"); } *************** *** 484,496 **** StringBuffer buf = new StringBuffer(100) .append("select ") ! .append( identifierColumnNames[0] ) .append(" from ") .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", identifierColumnNames ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append(versionColumnName) .append(" = ?"); } --- 352,364 ---- StringBuffer buf = new StringBuffer(100) .append("select ") ! .append( getIdentifierColumnNames()[0] ) .append(" from ") .append(qualifiedTableName) .append(" where ") ! .append( StringHelper.join( " = ? and ", getIdentifierColumnNames() ) ) //TODO:refactor out copied code .append(" = ?"); if ( isVersioned() ) { buf.append(" and ") ! .append( getVersionColumnName() ) .append(" = ?"); } *************** *** 533,537 **** if ( id!=null ) { getIdentifierType().nullSafeSet( statement, id, index, session ); ! index+=identifierColumnNames.length; } --- 401,405 ---- if ( id!=null ) { getIdentifierType().nullSafeSet( statement, id, index, session ); ! index+=getIdentifierColumnNames().length; } *************** *** 722,726 **** try { ! if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], version, identifierColumnNames.length + 1, session ); for ( int i=tableNames.length-1; i>=0; i-- ) { --- 590,594 ---- try { ! if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], version, getIdentifierColumnNames().length + 1, session ); for ( int i=tableNames.length-1; i>=0; i-- ) { *************** *** 810,868 **** Table table = model.getRootTable(); qualifiedTableName = table.getQualifiedName( factory.getDefaultSchema() ); ! ! // IDENTIFIER ! ! int idColumnSpan = model.getIdentifier().getColumnSpan(); ! identifierColumnNames = new String[idColumnSpan]; ! Value idValue = model.getIdentifier(); ! ! Iterator iter = idValue.getColumnIterator(); ! int i=0; ! while ( iter.hasNext() ) { ! Column col = (Column) iter.next(); ! identifierColumnNames[i] = col.getName(); ! i++; ! } ! ! ! if ( idValue.isComposite() ) { ! ! iter = ( (cirrus.hibernate.map.Component) idValue ).getPropertyIterator(); ! while ( iter.hasNext() ) { ! ! Property prop = (Property) iter.next(); ! idTypesByPropertyPath.put( prop.getName(), prop.getType() ); ! ! String[] cols = new String[ prop.getColumnSpan() ]; ! Iterator colIter= prop.getColumnIterator(); ! int j=0; ! while ( colIter.hasNext() ) { ! Column col = (Column) colIter.next(); ! cols[j++] = col.getName(); ! } ! ! idColumnNamesByPropertyPath.put( prop.getName(), cols ); ! if ( model.hasEmbeddedIdentifier() ) { ! columnNamesByPropertyPath.put( prop.getName(), cols ); ! typesByPropertyPath.put( prop.getName(), prop.getType() ); ! } ! } ! } ! - final String identityColumnInsertString; - IdentifierGenerator idgen = model.getIdentifier().getIdentifierGenerator(); - useIdentityColumn = dialect.supportsIdentityColumns() && ( idgen instanceof NativeGenerator ); - if (useIdentityColumn) { - identitySelectString = dialect.getIdentitySelectString(); - identityColumnInsertString = dialect.getIdentityInsertString(); - } - else { - identitySelectString = null; - identityColumnInsertString = null; - } - //MULTITABLES --- 678,705 ---- Table table = model.getRootTable(); qualifiedTableName = table.getQualifiedName( factory.getDefaultSchema() ); ! ! // DISCRIMINATOR ! if ( model.isPolymorphic() ) { ! discriminatorColumnName = "clazz_"; ! try { ! discriminatorType = (DiscriminatorType) Hibernate.INTEGER; ! discriminatorValue = new Integer(0); ! discriminatorSQLString = "0"; } ! catch (ClassCastException cce) { ! throw new MappingException("Illegal discriminator type: " + model.getDiscriminator().getType().getClass().getName() ); ! } ! catch (Exception e) { ! throw new MappingException("Could not format discriminator value to SQL string", e ); ! } ! } ! else { ! discriminatorColumnName = null; ! discriminatorType = null; ! discriminatorValue = null; ! discriminatorSQLString = null; ! } //MULTITABLES *************** *** 870,875 **** ArrayList keyColumns = new ArrayList(); tables.add(qualifiedTableName); ! keyColumns.add(identifierColumnNames); Iterator titer = model.getTableClosureIterator(); while ( titer.hasNext() ) { --- 707,713 ---- ArrayList keyColumns = new ArrayList(); tables.add(qualifiedTableName); ! keyColumns.add( getIdentifierColumnNames() ); + int idColumnSpan = getIdentifierType().getColumnSpan(factory); Iterator titer = model.getTableClosureIterator(); while ( titer.hasNext() ) { *************** *** 890,894 **** keyColumns = new ArrayList(); tables.add(qualifiedTableName); ! keyColumns.add(identifierColumnNames); titer = model.getSubclassTableClosureIterator(); while ( titer.hasNext() ) { --- 728,732 ---- keyColumns = new ArrayList(); tables.add(qualifiedTableName); ! keyColumns.add( getIdentifierColumnNames() ); titer = model.getSubclassTableClosureIterator(); while ( titer.hasNext() ) { *************** *** 906,965 **** subclassTableKeyColumns = (String[][]) keyColumns.toArray( new String[0][] ); - // UNSAVED-VALUE: - - String cts = model.getIdentifier().getNullValue(); - if ( cts==null || "any".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_ANY; - } - else if ( "none".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_NONE; - } - else if ( "null".equals(cts) ) { - unsavedIdentifierValue=Cascades.SAVE_NULL; - } - else { - try { - unsavedIdentifierValue = new Cascades.IdentifierValue( ( (IdentifierType) model.getIdentifier().getType() ).stringToObject(cts) ); - } - catch (ClassCastException cce) { - throw new MappingException("Bad identifier type: " + model.getIdentifier().getType().getClass().getName() ); - } - catch (Exception e) { - throw new MappingException("Could not parse unsaved-value: " + cts); - } - } - - // VERSION: - - if ( model.isVersioned() ) { - versionColumnName = ( (Column) model.getVersion().getColumnIterator().next() ).getName(); - } - else { - versionColumnName = null; - } - - // DISCRIMINATOR - - if ( model.isPolymorphic() ) { - discriminatorColumnName = "clazz_"; - try { - discriminatorType = (DiscriminatorType) Hibernate.INTEGER; - discriminatorValue = new Integer(0); - discriminatorSQLString = "0"; - } - catch (ClassCastException cce) { - throw new MappingException("Illegal discriminator type: " + model.getDiscriminator().getType().getClass().getName() ); - } - catch (Exception e) { - throw new MappingException("Could not format discriminator value to SQL string", e ); - } - } - else { - discriminatorColumnName = null; - discriminatorType = null; - discriminatorValue = null; - discriminatorSQLString = null; - } - // PROPERTIES --- 744,747 ---- *************** *** 972,982 **** HashSet thisClassProperties = new HashSet(); ! iter = model.getPropertyClosureIterator(); ! i=0; while( iter.hasNext() ) { Property prop = (Property) iter.next(); thisClassProperties.add(prop); ! String tabname = prop.getValue().getTable().getQualifiedName( factory.getDefaultSchema() ); propertyTables[i] = getTableId(tabname, tableNames); propertyColumnSpans[i] = prop.getColumnSpan(); --- 754,765 ---- HashSet thisClassProperties = new HashSet(); ! Iterator iter = model.getPropertyClosureIterator(); ! int i=0; while( iter.hasNext() ) { Property prop = (Property) iter.next(); thisClassProperties.add(prop); ! Table tab = prop.getValue().getTable(); ! String tabname = tab.getQualifiedName( factory.getDefaultSchema() ); propertyTables[i] = getTableId(tabname, tableNames); propertyColumnSpans[i] = prop.getColumnSpan(); *************** *** 990,994 **** String colname = col.getName(); propCols[j] = colname; ! propAliases[j] = columnAlias(col); columns.add(colname); j++; --- 773,777 ---- String colname = col.getName(); propCols[j] = colname; ! propAliases[j] = col.getName() + tab.getUniqueInteger() + '_'; columns.add(colname); j++; *************** *** 1021,1025 **** definedBySubclass.add( new Boolean( !thisClassProperties.contains(prop) ) ); Iterator colIter = prop.getColumnIterator(); ! String tabname = prop.getValue().getTable().getQualifiedName( factory.getDefaultSchema() ); String[] cols = new String[ prop.getColumnSpan() ]; types.add( prop.getType() ); --- 804,809 ---- definedBySubclass.add( new Boolean( !thisClassProperties.contains(prop) ) ); Iterator colIter = prop.getColumnIterator(); ! Table tab = prop.getValue().getTable(); ! String tabname = tab.getQualifiedName( factory.getDefaultSchema() ); String[] cols = new String[ prop.getColumnSpan() ]; types.add( prop.getType() ); *************** *** 1032,1036 **** coltables.add(tabnum); cols[l++]=col.getName(); ! aliases.add( columnAlias(col) ); } propColumns.add(cols); --- 816,820 ---- coltables.add(tabnum); cols[l++]=col.getName(); ! aliases.add( col.getName() + tab.getUniqueInteger() + '_' ); } propColumns.add(cols); *************** *** 1058,1062 **** deleteStrings = generateDeleteStrings(); insertStrings = generateInsertStrings(false, null); ! identityInsertStrings = useIdentityColumn ? generateInsertStrings(true, identityColumnInsertString) : null; updateStrings = generateUpdateStrings(); --- 842,846 ---- deleteStrings = generateDeleteStrings(); insertStrings = generateInsertStrings(false, null); ! identityInsertStrings = isIdentifierAssignedByInsert() ? generateInsertStrings( true, dialect.getIdentityInsertString() ) : null; updateStrings = generateUpdateStrings(); *************** *** 1076,1080 **** subclassClosure[subclassSpan-1] = mappedClass; if ( model.isPolymorphic() ) { - subclassesByDiscriminatorValue = new HashMap(); subclassesByDiscriminatorValue.put(discriminatorValue, mappedClass); discriminators = new String[subclassSpan]; --- 860,863 ---- *************** *** 1089,1093 **** } else { - subclassesByDiscriminatorValue = null; discriminators = null; tableNumbers = null; --- 872,875 ---- *************** *** 1190,1194 **** subclassTableNameClosure[i], name+i, ! StringHelper.prefix(identifierColumnNames, name + '.'), subclassTableKeyColumns[i] ); --- 972,976 ---- subclassTableNameClosure[i], name+i, ! StringHelper.prefix( getIdentifierColumnNames(), name + '.' ), subclassTableKeyColumns[i] ); *************** *** 1204,1208 **** buf, name+i, ! StringHelper.prefix(identifierColumnNames, name + '.'), subclassTableKeyColumns[i] ); --- 986,990 ---- buf, name+i, ! StringHelper.prefix( getIdentifierColumnNames(), name + '.' ), subclassTableKeyColumns[i] ); *************** *** 1214,1218 **** public String getQueryWhereClause(String name) throws MappingException { ! //TODO: change to name3.id is not null if ( isInherited() ) { --- 996,1000 ---- public String getQueryWhereClause(String name) throws MappingException { ! //TODO: change to use inner joins instead of "not null" if ( isInherited() ) { *************** *** 1225,1232 **** .append( notNullColumns[last] ) .append(" is not null ") .toString(); } else { ! return null; } --- 1007,1018 ---- .append( notNullColumns[last] ) .append(" is not null ") + .append( outerJoinsAfterWhere(name) ) .toString(); } else { ! String ojw = outerJoinsAfterWhere(name); ! //remove leading " AND " ! if ( ojw.toUpperCase().startsWith(" AND ") ) ojw = ojw.substring(5); ! return ojw; } *************** *** 1282,1286 **** } buf.append(" end as ") ! .append( aliasColumn( getDiscriminatorColumnName(), suffix) ); } --- 1068,1072 ---- } buf.append(" end as ") ! .append( aliasColumn( discriminatorColumnName, suffix) ); } *************** *** 1298,1312 **** } return buf.toString(); - } - - private static final Map colAliases = new HashMap(); - private static int counter = 0; - private static synchronized String columnAlias(Column col) { - String alias = (String) colAliases.get(col); - if (alias==null) { - alias = col.getName() + counter++; - colAliases.put( col, alias ); - } - return alias; } --- 1084,1087 ---- |