|
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);
}
|