|
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 ----
|