📄 joinedsubclassentitypersister.java
字号:
); notNullColumnTableNumbers[subclassSpan-1] = id; notNullColumnNames = new String[subclassSpan]; notNullColumnNames[subclassSpan-1] = subclassTableKeyColumnClosure[id][0]; //( (Column) model.getTable().getPrimaryKey().getColumnIterator().next() ).getName(); } else { discriminatorValues = null; notNullColumnTableNumbers = null; notNullColumnNames = null; } iter = persistentClass.getSubclassIterator(); int k=0; while ( iter.hasNext() ) { Subclass sc = (Subclass) iter.next(); subclassClosure[k] = sc.getEntityName(); try { if ( persistentClass.isPolymorphic() ) { // we now use subclass ids that are consistent across all // persisters for a class hierarchy, so that the use of // "foo.class = Bar" works in HQL Integer subclassId = new Integer( sc.getSubclassId() );//new Integer(k+1); subclassesByDiscriminatorValue.put( subclassId, sc.getEntityName() ); discriminatorValues[k] = subclassId.toString(); int id = getTableId( sc.getTable().getQualifiedName( factory.getDialect(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ), subclassTableNameClosure ); notNullColumnTableNumbers[k] = id; notNullColumnNames[k] = subclassTableKeyColumnClosure[id][0]; //( (Column) sc.getTable().getPrimaryKey().getColumnIterator().next() ).getName(); } } catch (Exception e) { throw new MappingException("Error parsing discriminator value", e ); } k++; } initLockers(); initSubclassPropertyAliasesMap(persistentClass); postConstruct(mapping); } /*public void postInstantiate() throws MappingException { super.postInstantiate(); //TODO: other lock modes? loader = createEntityLoader(LockMode.NONE, CollectionHelper.EMPTY_MAP); }*/ public String getSubclassPropertyTableName(int i) { return subclassTableNameClosure[ subclassPropertyTableNumberClosure[i] ]; } public Type getDiscriminatorType() { return Hibernate.INTEGER; } public String getDiscriminatorSQLValue() { return discriminatorSQLString; } public String getSubclassForDiscriminatorValue(Object value) { return (String) subclassesByDiscriminatorValue.get(value); } public Serializable[] getPropertySpaces() { return spaces; // don't need subclass tables, because they can't appear in conditions } protected String getTableName(int j) { return naturalOrderTableNames[j]; } protected String[] getKeyColumns(int j) { return naturalOrderTableKeyColumns[j]; } protected boolean isTableCascadeDeleteEnabled(int j) { return naturalOrderCascadeDeleteEnabled[j]; } protected boolean isPropertyOfTable(int property, int j) { return naturalOrderPropertyTableNumbers[property]==j; } /** * Load an instance using either the <tt>forUpdateLoader</tt> or the outer joining <tt>loader</tt>, * depending upon the value of the <tt>lock</tt> parameter */ /*public Object load(Serializable id, Object optionalObject, LockMode lockMode, SessionImplementor session) throws HibernateException { if ( log.isTraceEnabled() ) log.trace( "Materializing entity: " + MessageHelper.infoString(this, id) ); final UniqueEntityLoader loader = hasQueryLoader() ? getQueryLoader() : this.loader; try { final Object result = loader.load(id, optionalObject, session); if (result!=null) lock(id, getVersion(result), result, lockMode, session); return result; } catch (SQLException sqle) { throw new JDBCException( "could not load by id: " + MessageHelper.infoString(this, id), sqle ); } }*/ private static final void reverse(Object[] objects, int len) { Object[] temp = new Object[len]; for (int i=0; i<len; i++) { temp[i] = objects[len-i-1]; } for (int i=0; i<len; i++) { objects[i] = temp[i]; } } private static final String[] reverse(String[] objects) { int len = objects.length; String[] temp = new String[len]; for (int i=0; i<len; i++) { temp[i] = objects[len-i-1]; } return temp; } private static final String[][] reverse(String[][] objects) { int len = objects.length; String[][] temp = new String[len][]; for (int i=0; i<len; i++) { temp[i] = objects[len-i-1]; } return temp; } public String fromTableFragment(String alias) { return getTableName() + ' ' + alias; } public String getTableName() { return tableNames[0]; } private static int getTableId(String tableName, String[] tables) { for ( int j=0; j<tables.length; j++ ) { if ( tableName.equals( tables[j] ) ) { return j; } } throw new AssertionFailure("Table " + tableName + " not found"); } public void addDiscriminatorToSelect(SelectFragment select, String name, String suffix) { if ( hasSubclasses() ) { select.setExtraSelectList( discriminatorFragment(name), getDiscriminatorAlias() ); } } private CaseFragment discriminatorFragment(String alias) { CaseFragment cases = getFactory().getDialect().createCaseFragment(); for ( int i=0; i<discriminatorValues.length; i++ ) { cases.addWhenColumnNotNull( generateTableAlias( alias, notNullColumnTableNumbers[i] ), notNullColumnNames[i], discriminatorValues[i] ); } return cases; } public String filterFragment(String alias) { return hasWhere() ? " and " + getSQLWhereString( generateFilterConditionAlias( alias ) ) : ""; } public String generateFilterConditionAlias(String rootAlias) { return generateTableAlias( rootAlias, tableSpan-1 ); } public String[] getIdentifierColumnNames() { return tableKeyColumns[0]; } public String[] toColumns(String alias, String propertyName) throws QueryException { if ( ENTITY_CLASS.equals(propertyName) ) { // This doesn't actually seem to work but it *might* // work on some dbs. Also it doesn't work if there // are multiple columns of results because it // is not accounting for the suffix: // return new String[] { getDiscriminatorColumnName() }; return new String[] { discriminatorFragment(alias).toFragmentString() }; } else { return super.toColumns(alias, propertyName); } } protected int[] getPropertyTableNumbersInSelect() { return propertyTableNumbers; } protected int getSubclassPropertyTableNumber(int i) { return subclassPropertyTableNumberClosure[i]; } public int getTableSpan() { return tableSpan; } public boolean isMultiTable() { return true; } protected int[] getSubclassColumnTableNumberClosure() { return subclassColumnTableNumberClosure; } protected int[] getSubclassFormulaTableNumberClosure() { return subclassFormulaTableNumberClosure; } protected int[] getPropertyTableNumbers() { return naturalOrderPropertyTableNumbers; } 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]; } public String getPropertyTableName(String propertyName) { Integer index = getEntityMetamodel().getPropertyIndexOrNull(propertyName); if ( index == null ) { return null; } return tableNames[ propertyTableNumbers[ index.intValue() ] ]; } public String[] getConstraintOrderedTableNameClosure() { return constraintOrderedTableNames; } public String[][] getContraintOrderedTableKeyColumnClosure() { return constraintOrderedKeyColumnNames; } public String getRootTableName() { return naturalOrderTableNames[0]; } public String getRootTableAlias(String drivingAlias) { return generateTableAlias( drivingAlias, getTableId( getRootTableName(), tableNames ) ); } public Declarer getSubclassPropertyDeclarer(String propertyPath) { if ( "class".equals( propertyPath ) ) { // special case where we need to force incloude all subclass joins return Declarer.SUBCLASS; } return super.getSubclassPropertyDeclarer( propertyPath ); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -