From: <one...@us...> - 2002-11-03 06:20:03
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister In directory usw-pr-cvs1:/tmp/cvs-serv16944/hibernate/persister Modified Files: EntityPersister.java MultiTableEntityPersister.java Log Message: removed reliance upon discriminator column in MultiTableEntityPersistser Index: EntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/EntityPersister.java,v retrieving revision 1.33 retrieving revision 1.34 diff -C2 -d -r1.33 -r1.34 *** EntityPersister.java 31 Oct 2002 14:00:25 -0000 1.33 --- EntityPersister.java 3 Nov 2002 06:19:59 -0000 1.34 *************** *** 413,417 **** * Marshall the fields of a persistent instance to a prepared statement */ ! protected void dehydrate(Serializable id, Object[] fields, PreparedStatement st, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); --- 413,417 ---- * Marshall the fields of a persistent instance to a prepared statement */ ! protected int dehydrate(Serializable id, Object[] fields, PreparedStatement st, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); *************** *** 423,427 **** } ! if ( id!=null ) getIdentifierType().nullSafeSet( st, id, index, session ); } --- 423,432 ---- } ! if ( id!=null ) { ! getIdentifierType().nullSafeSet( st, id, index, session ); ! index += identifierColumnNames.length; ! } ! ! return index; } *************** *** 639,646 **** //Now write the values of fields onto the prepared statement ! dehydrate(id, fields, statement, session); if ( isVersioned() ) { ! getVersionType().nullSafeSet( statement, oldVersion, columnNames.length + identifierColumnNames.length + 1, session ); check( statement.executeUpdate(), id ); } --- 644,651 ---- //Now write the values of fields onto the prepared statement ! int versionParam = dehydrate(id, fields, statement, session); if ( isVersioned() ) { ! getVersionType().nullSafeSet( statement, oldVersion, versionParam, session ); check( statement.executeUpdate(), id ); } *************** *** 745,752 **** } catch (ClassCastException cce) { ! throw new MappingException("Bad identifier type: " + model.getDiscriminator().getType().getClass().getName() ); } catch (Exception e) { ! throw new MappingException("Could not parse cascade-to-save value: " + cts); } } --- 750,757 ---- } 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); } } Index: MultiTableEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/MultiTableEntityPersister.java,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** MultiTableEntityPersister.java 27 Oct 2002 03:11:33 -0000 1.23 --- MultiTableEntityPersister.java 3 Nov 2002 06:19:59 -0000 1.24 *************** *** 30,33 **** --- 30,34 ---- import cirrus.hibernate.AssertionFailure; + import cirrus.hibernate.Hibernate; import cirrus.hibernate.HibernateException; import cirrus.hibernate.LockMode; *************** *** 82,86 **** private transient final String discriminatorColumnName; private transient final String versionColumnName; - private transient final int versionParam; private transient final String[] columnNames; --- 83,86 ---- *************** *** 95,98 **** --- 95,101 ---- 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(); *************** *** 341,355 **** .append( StringHelper.join( ", ", tableKeyColumns[j] ) ) - .append( j==0 && isPolymorphic() ? ", " + getDiscriminatorColumnName() : "" ) //to handle discriminator column .append(" ) values ( ") .append( StringHelper.repeat( "?, ", count ) ) .append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) .append( identifierColumnNames.length > 0 ? "?" : "" ); ! ! if ( j==0 && isPolymorphic() ) { ! buf.append(", ") ! .append(discriminatorSQLString); //to handle discriminator column ! } ! result[j] = buf.append(" )").toString(); --- 344,352 ---- .append( StringHelper.join( ", ", tableKeyColumns[j] ) ) .append(" ) values ( ") .append( StringHelper.repeat( "?, ", count ) ) .append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) .append( identifierColumnNames.length > 0 ? "?" : "" ); ! result[j] = buf.append(" )").toString(); *************** *** 382,388 **** .append("select ") .append(tables[0] + '.') ! .append( StringHelper.join( ", " + tables[0] + '.', identifierColumnNames ) ) ! .append( hasSubclasses() ? ", " + getDiscriminatorColumnName() : "" ) ! .append( subclassColumnClosure.length==0 ? "" : ", "); for ( int i=0; i<subclassColumnClosure.length; i++ ) { buf.append( subclassTableNameClosure[ subclassColumnTableNumberClosure[i] ] ) --- 379,399 ---- .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] ] ) *************** *** 473,480 **** * Marshall the fields of a persistent instance to a prepared statement */ ! protected void dehydrate(Serializable id, Object[] fields, PreparedStatement[] sts, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); for ( int i=0; i<tableNames.length; i++ ) { --- 484,493 ---- * Marshall the fields of a persistent instance to a prepared statement */ ! protected int dehydrate(Serializable id, Object[] fields, PreparedStatement[] sts, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); + int versionParam = 0; + for ( int i=0; i<tableNames.length; i++ ) { *************** *** 489,495 **** } ! if ( id!=null ) getIdentifierType().nullSafeSet( sts[i], id, index, session ); } } --- 502,515 ---- } ! if ( id!=null ) { ! getIdentifierType().nullSafeSet( sts[i], id, index, session ); ! index+=identifierColumnNames.length; ! } ! ! if (i==0) versionParam = index; } + + return versionParam; } *************** *** 703,707 **** try { ! dehydrate(id, fields, statements, session); if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); --- 723,727 ---- try { ! int versionParam = dehydrate(id, fields, statements, session); if ( isVersioned() ) getVersionType().nullSafeSet( statements[0], oldVersion, versionParam, session ); *************** *** 732,736 **** Table table = model.getRootTable(); qualifiedTableName = table.getQualifiedName( factory.getDefaultSchema() ); - versionParam = table.getColumnSpan(); // IDENTIFIER --- 752,755 ---- *************** *** 791,798 **** --- 810,822 ---- //MULTITABLES + //HashMap tableids = new HashMap(); + //int id = 0; + ArrayList tables = new ArrayList(); ArrayList keyColumns = new ArrayList(); tables.add(qualifiedTableName); keyColumns.add(identifierColumnNames); + //tableids.put( table, new Integer(id) ); + Iterator titer = model.getTableClosureIterator(); while ( titer.hasNext() ) { *************** *** 805,808 **** --- 829,834 ---- for ( int k=0; k<idColumnSpan; k++ ) key[k] = ( (Column) kiter.next() ).getName(); keyColumns.add(key); + + //tableids.put( tab, new Integer(++id) ); } } *************** *** 846,853 **** } catch (ClassCastException cce) { ! throw new MappingException("Bad identifier type: " + model.getDiscriminator().getType().getClass().getName() ); } catch (Exception e) { ! throw new MappingException("Could not parse cascade-to-save value: " + cts); } } --- 872,879 ---- } 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); } } *************** *** 865,873 **** if ( model.isPolymorphic() ) { ! discriminatorColumnName = ( (Column) model.getDiscriminator().getColumnIterator().next() ).getName(); try { ! discriminatorType = (DiscriminatorType) model.getDiscriminator().getType(); ! discriminatorValue = discriminatorType.stringToObject( model.getDiscriminatorValue() ); ! discriminatorSQLString = discriminatorType.objectToSQLString(discriminatorValue); } catch (ClassCastException cce) { --- 891,899 ---- if ( model.isPolymorphic() ) { ! discriminatorColumnName = "clazz_"; try { ! discriminatorType = (DiscriminatorType) Hibernate.INTEGER; ! discriminatorValue = new Integer(0); ! discriminatorSQLString = "0"; } catch (ClassCastException cce) { *************** *** 979,1005 **** Class mappedClass = model.getPersistentClass(); ! iter = model.getSubclassIterator(); int subclassSpan = model.getSubclassSpan() + 1; subclassClosure = new Class[subclassSpan]; ! subclassClosure[0] = mappedClass; if ( model.isPolymorphic() ) { subclassesByDiscriminatorValue = new HashMap(); subclassesByDiscriminatorValue.put( discriminatorValue, mappedClass ); } else { subclassesByDiscriminatorValue = null; } ! // SUBCLASSES ! ! int k=1; while ( iter.hasNext() ) { Subclass sc = (Subclass) iter.next(); subclassClosure[k] = sc.getPersistentClass(); try { ! if ( model.isPolymorphic() ) subclassesByDiscriminatorValue.put( ! discriminatorType.stringToObject( sc.getDiscriminatorValue() ), ! sc.getPersistentClass() ! ); } catch (Exception e) { --- 1005,1046 ---- Class mappedClass = model.getPersistentClass(); ! // SUBCLASSES ! int subclassSpan = model.getSubclassSpan() + 1; subclassClosure = new Class[subclassSpan]; ! subclassClosure[subclassSpan-1] = mappedClass; if ( model.isPolymorphic() ) { subclassesByDiscriminatorValue = new HashMap(); subclassesByDiscriminatorValue.put( discriminatorValue, mappedClass ); + discriminators = new String[subclassSpan]; + discriminators[subclassSpan-1] = discriminatorSQLString; + tableNumbers = new int[subclassSpan]; + tableNumbers[subclassSpan-1] = getTableId(qualifiedTableName, subclassTableNameClosure); + notNullColumns = new String[subclassSpan]; + notNullColumns[subclassSpan-1] = identifierColumnNames[0]; } else { subclassesByDiscriminatorValue = null; + discriminators = null; + tableNumbers = null; + notNullColumns = null; } ! iter = model.getSubclassIterator(); ! int k=0; while ( iter.hasNext() ) { Subclass sc = (Subclass) iter.next(); subclassClosure[k] = sc.getPersistentClass(); try { ! if ( model.isPolymorphic() ) { ! Object disc = new Integer(k+1); ! subclassesByDiscriminatorValue.put( disc, sc.getPersistentClass() ); ! discriminators[k] = disc.toString(); ! tableNumbers[k] = getTableId( ! sc.getTable().getQualifiedName( factory.getDefaultSchema() ), ! subclassTableNameClosure ! ); ! notNullColumns[k] = ( (Column) sc.getTable().getPrimaryKey().getColumnIterator().next() ).getName(); ! } } catch (Exception e) { *************** *** 1010,1013 **** --- 1051,1055 ---- hasColumns = columnNames.length!=0; + } *************** *** 1092,1111 **** public String getQueryWhereClause(String name) throws MappingException { if ( isInherited() ) { ! StringBuffer buf = new StringBuffer(40); ! buf.append(name) .append('.') ! .append( getDiscriminatorColumnName() ) ! .append(" in ("); ! Class[] subclasses = getSubclassClosure(); ! for ( int i=0; i<subclasses.length; i++ ) { ! buf.append( ! ( (Queryable) factory.getPersister( subclasses[i] ) ) ! .getDiscriminatorSQLString() ! ); ! if (i<subclasses.length-1) buf.append(", "); ! } ! buf.append(") "); ! return buf.toString(); } else { --- 1134,1149 ---- public String getQueryWhereClause(String name) throws MappingException { + //TODO: change to name3.id is not null + if ( isInherited() ) { ! int last = tableNumbers.length-1; ! int tab = tableNumbers[last]; ! return new StringBuffer(40) ! .append(name) ! .append( (tab==0) ? "" : Integer.toString(tab) ) .append('.') ! .append( notNullColumns[last] ) ! .append(" is not null ") ! .toString(); } else { *************** *** 1123,1127 **** ! public String[] toColumn(String name, String property) throws QueryException { String[] idcols = super.toColumns(name, property); --- 1161,1165 ---- ! public String[] toColumns(String name, String property) throws QueryException { String[] idcols = super.toColumns(name, property); *************** *** 1145,1158 **** public String selectPropertiesString(String name, String suffix) { ! StringBuffer buf = new StringBuffer(30); if ( hasSubclasses() ) { ! String discr = getDiscriminatorColumnName(); ! buf.append(", ") ! .append(name) ! .append('.') ! .append(discr) ! .append(" as ") ! .append(discr).append(suffix); } --- 1183,1203 ---- public String selectPropertiesString(String name, String suffix) { ! StringBuffer buf = new StringBuffer(50); if ( hasSubclasses() ) { ! buf.append(", case"); ! for ( int i=0; i< discriminators.length; i++ ) { ! buf.append(" when ") ! .append(name); ! int tab = tableNumbers[i]; ! if (tab!=0) buf.append(tab); ! buf.append('.') ! .append( notNullColumns[i] ) ! .append(" is not null then ") ! .append( discriminators[i] ); ! } ! buf.append(" end as ") ! .append( getDiscriminatorColumnName() ) ! .append(suffix); } |