📄 singletableentitypersister.java
字号:
columnJoinNumbers.add(join); } } } subclassColumnTableNumberClosure = ArrayHelper.toIntArray(columnJoinNumbers); subclassFormulaTableNumberClosure = ArrayHelper.toIntArray(formulaJoinedNumbers); subclassPropertyTableNumberClosure = ArrayHelper.toIntArray(propertyJoinNumbers); int subclassSpan = persistentClass.getSubclassSpan() + 1; subclassClosure = new String[subclassSpan]; subclassClosure[0] = getEntityName(); if ( persistentClass.isPolymorphic() ) { subclassesByDiscriminatorValue.put( discriminatorValue, getEntityName() ); } // SUBCLASSES if ( persistentClass.isPolymorphic() ) { iter = persistentClass.getSubclassIterator(); int k=1; while ( iter.hasNext() ) { Subclass sc = (Subclass) iter.next(); subclassClosure[k++] = sc.getEntityName(); if ( sc.isDiscriminatorValueNull() ) { subclassesByDiscriminatorValue.put( NULL_DISCRIMINATOR, sc.getEntityName() ); } else if ( sc.isDiscriminatorValueNotNull() ) { subclassesByDiscriminatorValue.put( NOT_NULL_DISCRIMINATOR, sc.getEntityName() ); } else { try { DiscriminatorType dtype = (DiscriminatorType) discriminatorType; subclassesByDiscriminatorValue.put( dtype.stringToObject( sc.getDiscriminatorValue() ), sc.getEntityName() ); } catch (ClassCastException cce) { throw new MappingException("Illegal discriminator type: " + discriminatorType.getName() ); } catch (Exception e) { throw new MappingException("Error parsing discriminator value", e); } } } } initLockers(); initSubclassPropertyAliasesMap(persistentClass); postConstruct(mapping); } protected boolean isInverseTable(int j) { return isInverseTable[j]; } protected boolean isInverseSubclassTable(int j) { return isInverseSubclassTable[j]; } public String getDiscriminatorColumnName() { return discriminatorColumnName; } protected String getDiscriminatorAlias() { return discriminatorAlias; } protected String getDiscriminatorFormulaTemplate() { return discriminatorFormulaTemplate; } public String getTableName() { return qualifiedTableNames[0]; } public Type getDiscriminatorType() { return discriminatorType; } public String getDiscriminatorSQLValue() { return discriminatorSQLValue; } public String[] getSubclassClosure() { return subclassClosure; } public String getSubclassForDiscriminatorValue(Object value) { if (value==null) { return (String) subclassesByDiscriminatorValue.get(NULL_DISCRIMINATOR); } else { String result = (String) subclassesByDiscriminatorValue.get(value); if (result==null) result = (String) subclassesByDiscriminatorValue.get(NOT_NULL_DISCRIMINATOR); return result; } } public Serializable[] getPropertySpaces() { return spaces; } //Access cached SQL protected boolean isDiscriminatorFormula() { return discriminatorColumnName==null; } protected String getDiscriminatorFormula() { return discriminatorFormula; } protected String getTableName(int j) { return qualifiedTableNames[j]; } protected String[] getKeyColumns(int j) { return keyColumnNames[j]; } protected boolean isTableCascadeDeleteEnabled(int j) { return cascadeDeleteEnabled[j]; } protected boolean isPropertyOfTable(int property, int j) { return propertyTableNumbers[property]==j; } protected boolean isSubclassTableSequentialSelect(int j) { return subclassTableSequentialSelect[j] && !isClassOrSuperclassTable[j]; } // Execute the SQL: public String fromTableFragment(String name) { return getTableName() + ' ' + name; } public String filterFragment(String alias) throws MappingException { String result = discriminatorFilterFragment(alias); if ( hasWhere() ) result += " and " + getSQLWhereString(alias); return result; } public String oneToManyFilterFragment(String alias) throws MappingException { return forceDiscriminator ? discriminatorFilterFragment(alias) : ""; } private String discriminatorFilterFragment(String alias) throws MappingException { if ( needsDiscriminator() ) { InFragment frag = new InFragment(); if ( isDiscriminatorFormula() ) { frag.setFormula( alias, getDiscriminatorFormulaTemplate() ); } else { frag.setColumn( alias, getDiscriminatorColumnName() ); } String[] subclasses = getSubclassClosure(); for ( int i=0; i<subclasses.length; i++ ) { final Queryable queryable = (Queryable) getFactory().getEntityPersister( subclasses[i] ); if ( !queryable.isAbstract() ) frag.addValue( queryable.getDiscriminatorSQLValue() ); } StringBuffer buf = new StringBuffer(50) .append(" and ") .append( frag.toFragmentString() ); return buf.toString(); } else { return ""; } } private boolean needsDiscriminator() { return forceDiscriminator || isInherited(); } public String getSubclassPropertyTableName(int i) { return subclassTableNameClosure[ subclassPropertyTableNumberClosure[i] ]; } protected void addDiscriminatorToSelect(SelectFragment select, String name, String suffix) { if ( isDiscriminatorFormula() ) { select.addFormula( name, getDiscriminatorFormulaTemplate(), getDiscriminatorAlias() ); } else { select.addColumn( name, getDiscriminatorColumnName(), getDiscriminatorAlias() ); } } protected int[] getPropertyTableNumbersInSelect() { return propertyTableNumbers; } protected int getSubclassPropertyTableNumber(int i) { return subclassPropertyTableNumberClosure[i]; } public int getTableSpan() { return joinSpan; } protected void addDiscriminatorToInsert(Insert insert) { if (discriminatorInsertable) { insert.addColumn( getDiscriminatorColumnName(), discriminatorSQLValue ); } } protected int[] getSubclassColumnTableNumberClosure() { return subclassColumnTableNumberClosure; } protected int[] getSubclassFormulaTableNumberClosure() { return subclassFormulaTableNumberClosure; } protected int[] getPropertyTableNumbers() { return propertyTableNumbers; } protected boolean isSubclassPropertyDeferred(String propertyName, String entityName) { return hasSequentialSelects && isSubclassTableSequentialSelect( getSubclassPropertyTableNumber(propertyName, entityName) ); } public boolean hasSequentialSelect() { return hasSequentialSelects; } private int getSubclassPropertyTableNumber(String propertyName, String entityName) { Type type = propertyMapping.toType(propertyName); if ( type.isAssociationType() && ( (AssociationType) type ).useLHSPrimaryKey() ) return 0; final Integer tabnum = (Integer) propertyTableNumbersByNameAndSubclass.get(entityName + '.' + propertyName); return tabnum==null ? 0 : tabnum.intValue(); } protected String getSequentialSelect(String entityName) { return (String) sequentialSelectStringsByEntityName.get(entityName); } private String generateSequentialSelect(Loadable persister) { //if ( this==persister || !hasSequentialSelects ) return null; //note that this method could easily be moved up to BasicEntityPersister, //if we ever needed to reuse it from other subclasses //figure out which tables need to be fetched AbstractEntityPersister subclassPersister = (AbstractEntityPersister) persister; HashSet tableNumbers = new HashSet(); String[] props = subclassPersister.getPropertyNames(); String[] classes = subclassPersister.getPropertySubclassNames(); for ( int i=0; i<props.length; i++ ) { int propTableNumber = getSubclassPropertyTableNumber( props[i], classes[i] ); if ( isSubclassTableSequentialSelect(propTableNumber) && !isSubclassTableLazy(propTableNumber) ) { tableNumbers.add( new Integer(propTableNumber) ); } } if ( tableNumbers.isEmpty() ) return null; //figure out which columns are needed ArrayList columnNumbers = new ArrayList(); final int[] columnTableNumbers = getSubclassColumnTableNumberClosure(); for ( int i=0; i<getSubclassColumnClosure().length; i++ ) { if ( tableNumbers.contains( new Integer( columnTableNumbers[i] ) ) ) { columnNumbers.add( new Integer(i) ); } } //figure out which formulas are needed ArrayList formulaNumbers = new ArrayList(); final int[] formulaTableNumbers = getSubclassColumnTableNumberClosure(); for ( int i=0; i<getSubclassFormulaTemplateClosure().length; i++ ) { if ( tableNumbers.contains( new Integer( formulaTableNumbers[i] ) ) ) { formulaNumbers.add( new Integer(i) ); } } //render the SQL return renderSelect( ArrayHelper.toIntArray(tableNumbers), ArrayHelper.toIntArray(columnNumbers), ArrayHelper.toIntArray(formulaNumbers) ); } protected String[] getSubclassTableKeyColumns(int j) { return subclassTableKeyColumnClosure[j]; } public String getSubclassTableName(int j) { return subclassTableNameClosure[j]; } public int getSubclassTableSpan() { return subclassTableNameClosure.length; } protected boolean isClassOrSuperclassTable(int j) { return isClassOrSuperclassTable[j]; } protected boolean isSubclassTableLazy(int j) { return subclassTableIsLazyClosure[j]; } protected boolean isNullableTable(int j) { return isNullableTable[j]; } protected boolean isNullableSubclassTable(int j) { return isNullableSubclassTable[j]; } public String getPropertyTableName(String propertyName) { Integer index = getEntityMetamodel().getPropertyIndexOrNull(propertyName); if (index==null) return null; return qualifiedTableNames[ propertyTableNumbers[ index.intValue() ] ]; } public void postInstantiate() { super.postInstantiate(); if (hasSequentialSelects) { String[] entityNames = getSubclassClosure(); for ( int i=1; i<entityNames.length; i++ ) { Loadable loadable = (Loadable) getFactory().getEntityPersister( entityNames[i] ); if ( !loadable.isAbstract() ) { //perhaps not really necessary... String sequentialSelect = generateSequentialSelect(loadable); sequentialSelectStringsByEntityName.put( entityNames[i], sequentialSelect ); } } } } public boolean isMultiTable() { return getTableSpan() > 1; } public String[] getConstraintOrderedTableNameClosure() { return constraintOrderedTableNames; } public String[][] getContraintOrderedTableKeyColumnClosure() { return constraintOrderedKeyColumnNames; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -