From: <one...@us...> - 2002-11-05 10:42:56
|
Update of /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister In directory usw-pr-cvs1:/tmp/cvs-serv30123/hibernate/persister Modified Files: EntityPersister.java MultiTableEntityPersister.java Log Message: support native id generation for normalized mappings Index: EntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/EntityPersister.java,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** EntityPersister.java 5 Nov 2002 03:44:01 -0000 1.36 --- EntityPersister.java 5 Nov 2002 10:42:52 -0000 1.37 *************** *** 312,319 **** * Generate the SQL that inserts a row */ ! protected String generateInsertString(boolean identityString, String identityColumnInsertString) { boolean hasPropertyColumns = columnNames.length > 0; ! boolean insertIdentifierColumns = !identityString || identityColumnInsertString!=null; String commaAfterProperties = hasPropertyColumns && ( insertIdentifierColumns || isPolymorphic() ) ? ", " : ""; String commaAfterIdentifiers = insertIdentifierColumns && isPolymorphic() ? ", " : ""; --- 312,319 ---- * Generate the SQL that inserts a row */ ! protected String generateInsertString(boolean identityInsert, String identityColumnInsertString) { boolean hasPropertyColumns = columnNames.length > 0; ! boolean insertIdentifierColumns = !identityInsert || identityColumnInsertString!=null; String commaAfterProperties = hasPropertyColumns && ( insertIdentifierColumns || isPolymorphic() ) ? ", " : ""; String commaAfterIdentifiers = insertIdentifierColumns && isPolymorphic() ? ", " : ""; *************** *** 331,337 **** .append( hasPropertyColumns ? "?" : "" ) .append(commaAfterProperties); ! if ( !identityString ) { buf.append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) ! .append( identifierColumnNames.length > 0 ? "?" : "" ); } else if ( identityColumnInsertString!=null ) { --- 331,337 ---- .append( hasPropertyColumns ? "?" : "" ) .append(commaAfterProperties); ! if ( !identityInsert ) { buf.append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) ! .append("?"); } else if ( identityColumnInsertString!=null ) { *************** *** 539,547 **** try { - dehydrate(null, fields, statement, session); - statement.executeUpdate(); - } catch (SQLException sqle) { --- 539,544 ---- Index: MultiTableEntityPersister.java =================================================================== RCS file: /cvsroot/hibernate/Hibernate/cirrus/hibernate/persister/MultiTableEntityPersister.java,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** MultiTableEntityPersister.java 5 Nov 2002 03:44:01 -0000 1.26 --- MultiTableEntityPersister.java 5 Nov 2002 10:42:52 -0000 1.27 *************** *** 5,8 **** --- 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.SimpleEntityLoader; *************** *** 67,76 **** private transient final String[] deleteStrings; private transient final String[] insertStrings; private transient final String[] updateStrings; - private transient final String identityInsertString; private transient final String identitySelectString; private transient final boolean useIdentityColumn; ! private transient final String[] identifierColumnNames; private transient final Cascades.IdentifierValue unsavedIdentifierValue; --- 69,78 ---- private transient final String[] deleteStrings; private transient final String[] insertStrings; + 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; *************** *** 295,300 **** * The query that inserts a row, letting the database generate an id */ ! protected final String sqlIdentityInsert() { ! return identityInsertString; } --- 297,302 ---- * The query that inserts a row, letting the database generate an id */ ! protected final String[] sqlIdentityInsert() { ! return identityInsertStrings; } *************** *** 332,336 **** * Generate the SQL that inserts a row */ ! protected String[] generateInsertStrings() { String[] result = new String[tableNames.length]; for ( int j=0; j<tableNames.length; j++ ) { --- 334,338 ---- * Generate the SQL that inserts a row */ ! protected String[] generateInsertStrings(boolean identityInsert, String identityColumnInsertString) { String[] result = new String[tableNames.length]; for ( int j=0; j<tableNames.length; j++ ) { *************** *** 347,360 **** } StringBuffer buf = new StringBuffer("insert into ") ! .append( tableNames[j] ) ! .append(" ( ") ! .append( setters.toString() ) ! ! .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(); --- 349,377 ---- } + boolean hasPropertyColumns = count > 0; + boolean insertIdentifierColumns = !identityInsert || j>0 || identityColumnInsertString!=null; + StringBuffer buf = new StringBuffer("insert into ") ! .append( tableNames[j] ) ! .append(" ( ") ! .append( setters.toString() ); ! ! if (insertIdentifierColumns) { ! buf.append( StringHelper.join( ", ", tableKeyColumns[j] ) ); ! } ! else if (hasPropertyColumns) { ! buf.setLength( buf.length()-2 ); ! } ! ! buf.append(" ) values ( ") ! .append( StringHelper.repeat( "?, ", count ) ); ! ! if (insertIdentifierColumns) { ! buf.append( StringHelper.repeat( "?, ", identifierColumnNames.length-1 ) ) ! .append("?"); ! } ! else if (hasPropertyColumns) { ! buf.setLength( buf.length()-2 ); ! } result[j] = buf.append(" )").toString(); *************** *** 493,497 **** * 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); --- 510,514 ---- * Marshall the fields of a persistent instance to a prepared statement */ ! protected int dehydrate(Serializable id, Object[] fields, PreparedStatement[] statements, SessionImplementor session) throws SQLException, HibernateException { if ( log.isTraceEnabled() ) log.trace("Dehydrating entity: " + getClassName() + '#' + id); *************** *** 500,526 **** for ( int i=0; i<tableNames.length; i++ ) { ! int index = 1; ! for (int j=0; j<hydrateSpan; j++) { ! ! if ( propertyTables[j]==i ) { ! getPropertyTypes()[j].nullSafeSet( sts[i], fields[j], index, session ); ! index += propertyColumnSpans[j]; ! } ! ! } ! if ( id!=null ) { ! getIdentifierType().nullSafeSet( sts[i], id, index, session ); ! index+=identifierColumnNames.length; } - if (i==0) versionParam = index; - } ! return versionParam; ! } // Execute the SQL: --- 517,549 ---- for ( int i=0; i<tableNames.length; i++ ) { + int index = dehydrate(id, fields, i, statements[i], session); + if (i==0) versionParam = index; + } ! return versionParam; ! ! } ! ! private int dehydrate(Serializable id, Object[] fields, int table, PreparedStatement statement, SessionImplementor session) throws SQLException, HibernateException { ! ! int index = 1; ! ! for (int j=0; j<hydrateSpan; j++) { ! if ( propertyTables[j]==table ) { ! getPropertyTypes()[j].nullSafeSet( statement, fields[j], index, session ); ! index += propertyColumnSpans[j]; } } ! if ( id!=null ) { ! getIdentifierType().nullSafeSet( statement, id, index, session ); ! index+=identifierColumnNames.length; ! } ! ! return index; } + // Execute the SQL: *************** *** 617,636 **** public Serializable insert(Object[] fields, Object object, SessionImplementor session) throws SQLException, HibernateException { ! throw new UnsupportedOperationException(); ! ! /*if ( log.isTraceEnabled() ) { ! log.trace("Inserting entity: " + className + " (native id)"); ! if (versioned) log.trace( "Version: " + Versioning.getVersion(fields, this) ); } ! // Render the SQL query ! PreparedStatement statement = session.getBatcher().prepareStatement( sqlIdentityInsert() ); try { ! ! dehydrate(null, fields, statement, session); ! statement.executeUpdate(); - } catch (SQLException sqle) { --- 640,655 ---- public Serializable insert(Object[] fields, Object object, SessionImplementor session) throws SQLException, HibernateException { ! if ( log.isTraceEnabled() ) { ! log.trace("Inserting entity: " + getClassName() + " (native id)"); ! if ( isVersioned() ) log.trace( "Version: " + Versioning.getVersion(fields, this) ); } ! String[] sql = sqlIdentityInsert(); ! ! PreparedStatement statement = session.getBatcher().prepareStatement( sql[0] ); try { ! dehydrate(null, fields, 0, statement, session); statement.executeUpdate(); } catch (SQLException sqle) { *************** *** 644,652 **** // fetch the generated id: PreparedStatement idselect = session.getBatcher().prepareStatement( sqlIdentitySelect() ); ! try { ResultSet rs = idselect.executeQuery(); - final Serializable id; try { if ( !rs.next() ) throw new HibernateException("The database returned no natively generated identity value"); --- 663,670 ---- // fetch the generated id: PreparedStatement idselect = session.getBatcher().prepareStatement( sqlIdentitySelect() ); ! final Serializable id; try { ResultSet rs = idselect.executeQuery(); try { if ( !rs.next() ) throw new HibernateException("The database returned no natively generated identity value"); *************** *** 658,662 **** log.debug("Natively generated identity: " + id); - return id; } catch (SQLException sqle) { --- 676,679 ---- *************** *** 666,670 **** finally { session.getBatcher().closeStatement(idselect); ! }*/ } --- 683,707 ---- finally { session.getBatcher().closeStatement(idselect); ! } ! ! for ( int i=1; i<tableNames.length; i++ ) { ! ! statement = session.getBatcher().prepareStatement( sql[i] ); ! ! try { ! dehydrate(id, fields, i, statement, session); ! statement.executeUpdate(); ! } ! catch (SQLException sqle) { ! JDBCExceptionReporter.logExceptions(sqle); ! throw sqle; ! } ! finally { ! session.getBatcher().closeStatement(statement); ! } ! ! } ! ! return id; } *************** *** 804,830 **** ! useIdentityColumn=false; ! //idgen = model.getIdentifier().getIdentifierGenerator(); ! /*final String identityColumnInsertString; ! useIdentityColumn = ( dialect!=null ) && dialect.supportsIdentityColumns() && ( idgen instanceof NativeGenerator ); if (useIdentityColumn) { identitySelectString = dialect.getIdentitySelectString(); identityColumnInsertString = dialect.getIdentityInsertString(); } ! else {*/ identitySelectString = null; ! //identityColumnInsertString = null; ! //} ! //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(); --- 841,862 ---- ! 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 ArrayList tables = new ArrayList(); ArrayList keyColumns = new ArrayList(); tables.add(qualifiedTableName); keyColumns.add(identifierColumnNames); Iterator titer = model.getTableClosureIterator(); *************** *** 838,843 **** for ( int k=0; k<idColumnSpan; k++ ) key[k] = ( (Column) kiter.next() ).getName(); keyColumns.add(key); - - //tableids.put( tab, new Integer(++id) ); } } --- 870,873 ---- *************** *** 1015,1020 **** deleteStrings = generateDeleteStrings(); ! insertStrings = generateInsertStrings(); ! identityInsertString = null; //useIdentityColumn ? generateInsertString(true, identityColumnInsertString) : null; updateStrings = generateUpdateStrings(); --- 1045,1050 ---- deleteStrings = generateDeleteStrings(); ! insertStrings = generateInsertStrings(false, null); ! identityInsertStrings = useIdentityColumn ? generateInsertStrings(true, identityColumnInsertString) : null; updateStrings = generateUpdateStrings(); |