📄 hbmbinder.java
字号:
mappings.addSecondPass( new CollectionSecondPass( node, mappings, collection, inheritedMetas ) ); } Iterator iter = node.elementIterator( "filter" ); while ( iter.hasNext() ) { final Element filter = (Element) iter.next(); parseFilter( filter, collection, mappings ); } Iterator tables = node.elementIterator( "synchronize" ); while ( tables.hasNext() ) { collection.getSynchronizedTables().add( ( (Element) tables.next() ).attributeValue( "table" ) ); } Element element = node.element( "loader" ); if ( element != null ) { collection.setLoaderName( element.attributeValue( "query-ref" ) ); } collection.setReferencedPropertyName( node.element( "key" ).attributeValue( "property-ref" ) ); } private static void initLaziness( Element node, Fetchable fetchable, Mappings mappings, String proxyVal, boolean defaultLazy ) { Attribute lazyNode = node.attribute( "lazy" ); boolean isLazyTrue = lazyNode == null ? defaultLazy && fetchable.isLazy() : //fetch="join" overrides default laziness lazyNode.getValue().equals(proxyVal); //fetch="join" overrides default laziness fetchable.setLazy( isLazyTrue ); } private static void initLaziness( Element node, ToOne fetchable, Mappings mappings, boolean defaultLazy ) { if ( "no-proxy".equals( node.attributeValue( "lazy" ) ) ) { fetchable.setUnwrapProxy(true); fetchable.setLazy(true); //TODO: better to degrade to lazy="false" if uninstrumented } else { initLaziness(node, fetchable, mappings, "proxy", defaultLazy); } } private static void bindColumnsOrFormula(Element node, SimpleValue simpleValue, String path, boolean isNullable, Mappings mappings) { Attribute formulaNode = node.attribute( "formula" ); if ( formulaNode != null ) { Formula f = new Formula(); f.setFormula( formulaNode.getText() ); simpleValue.addFormula( f ); } else { bindColumns( node, simpleValue, isNullable, true, path, mappings ); } } private static void bindComment(Table table, Element node) { Element comment = node.element("comment"); if (comment!=null) table.setComment( comment.getTextTrim() ); } public static void bindManyToOne(Element node, ManyToOne manyToOne, String path, boolean isNullable, Mappings mappings) throws MappingException { bindColumnsOrFormula( node, manyToOne, path, isNullable, mappings ); initOuterJoinFetchSetting( node, manyToOne ); initLaziness( node, manyToOne, mappings, true ); Attribute ukName = node.attribute( "property-ref" ); if ( ukName != null ) { manyToOne.setReferencedPropertyName( ukName.getValue() ); } manyToOne.setReferencedEntityName( getEntityName( node, mappings ) ); String embed = node.attributeValue( "embed-xml" ); manyToOne.setEmbedded( embed == null || "true".equals( embed ) ); String notFound = node.attributeValue( "not-found" ); manyToOne.setIgnoreNotFound( "ignore".equals( notFound ) ); if( ukName != null && !manyToOne.isIgnoreNotFound() ) { if ( !node.getName().equals("many-to-many") ) { //TODO: really bad, evil hack to fix!!! mappings.addSecondPass( new ManyToOneSecondPass(manyToOne) ); } } Attribute fkNode = node.attribute( "foreign-key" ); if ( fkNode != null ) manyToOne.setForeignKeyName( fkNode.getValue() ); validateCascade( node, path ); } private static void validateCascade(Element node, String path) { String cascade = node.attributeValue( "cascade" ); if ( cascade != null && cascade.indexOf( "delete-orphan" ) >= 0 ) { throw new MappingException( "single-valued associations do not support orphan delete: " + path ); } } public static void bindAny(Element node, Any any, boolean isNullable, Mappings mappings) throws MappingException { any.setIdentifierType( getTypeFromXML( node ) ); Attribute metaAttribute = node.attribute( "meta-type" ); if ( metaAttribute != null ) { any.setMetaType( metaAttribute.getValue() ); Iterator iter = node.elementIterator( "meta-value" ); if ( iter.hasNext() ) { HashMap values = new HashMap(); org.hibernate.type.Type metaType = TypeFactory.heuristicType( any.getMetaType() ); while ( iter.hasNext() ) { Element metaValue = (Element) iter.next(); try { Object value = ( (DiscriminatorType) metaType ).stringToObject( metaValue .attributeValue( "value" ) ); String entityName = getClassName( metaValue.attribute( "class" ), mappings ); values.put( value, entityName ); } catch (ClassCastException cce) { throw new MappingException( "meta-type was not a DiscriminatorType: " + metaType.getName() ); } catch (Exception e) { throw new MappingException( "could not interpret meta-value", e ); } } any.setMetaValues( values ); } } bindColumns( node, any, isNullable, false, null, mappings ); } public static void bindOneToOne(Element node, OneToOne oneToOne, String path, boolean isNullable, Mappings mappings) throws MappingException { bindColumns( node, oneToOne, isNullable, false, null, mappings ); Attribute constrNode = node.attribute( "constrained" ); boolean constrained = constrNode != null && constrNode.getValue().equals( "true" ); oneToOne.setConstrained( constrained ); oneToOne.setForeignKeyType( constrained ? ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT : ForeignKeyDirection.FOREIGN_KEY_TO_PARENT ); initOuterJoinFetchSetting( node, oneToOne ); initLaziness( node, oneToOne, mappings, true ); oneToOne.setEmbedded( "true".equals( node.attributeValue( "embed-xml" ) ) ); Attribute fkNode = node.attribute( "foreign-key" ); if ( fkNode != null ) oneToOne.setForeignKeyName( fkNode.getValue() ); Attribute ukName = node.attribute( "property-ref" ); if ( ukName != null ) oneToOne.setReferencedPropertyName( ukName.getValue() ); oneToOne.setPropertyName( node.attributeValue( "name" ) ); oneToOne.setReferencedEntityName( getEntityName( node, mappings ) ); validateCascade( node, path ); } public static void bindOneToMany(Element node, OneToMany oneToMany, Mappings mappings) throws MappingException { oneToMany.setReferencedEntityName( getEntityName( node, mappings ) ); String embed = node.attributeValue( "embed-xml" ); oneToMany.setEmbedded( embed == null || "true".equals( embed ) ); String notFound = node.attributeValue( "not-found" ); oneToMany.setIgnoreNotFound( "ignore".equals( notFound ) ); } public static void bindColumn(Element node, Column column, boolean isNullable) { Attribute lengthNode = node.attribute( "length" ); if ( lengthNode != null ) column.setLength( Integer.parseInt( lengthNode.getValue() ) ); Attribute scalNode = node.attribute( "scale" ); if ( scalNode != null ) column.setScale( Integer.parseInt( scalNode.getValue() ) ); Attribute precNode = node.attribute( "precision" ); if ( precNode != null ) column.setPrecision( Integer.parseInt( precNode.getValue() ) ); Attribute nullNode = node.attribute( "not-null" ); column.setNullable( nullNode == null ? isNullable : nullNode.getValue().equals( "false" ) ); Attribute unqNode = node.attribute( "unique" ); if ( unqNode != null ) column.setUnique( unqNode.getValue().equals( "true" ) ); column.setCheckConstraint( node.attributeValue( "check" ) ); column.setDefaultValue( node.attributeValue( "default" ) ); Attribute typeNode = node.attribute( "sql-type" ); if ( typeNode != null ) column.setSqlType( typeNode.getValue() ); Element comment = node.element("comment"); if (comment!=null) column.setComment( comment.getTextTrim() ); } /** * Called for arrays and primitive arrays */ public static void bindArray(Element node, Array array, String prefix, String path, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { bindCollection( node, array, prefix, path, mappings, inheritedMetas ); Attribute att = node.attribute( "element-class" ); if ( att != null ) array.setElementClassName( getClassName( att, mappings ) ); } private static Class reflectedPropertyClass(String className, String propertyName) throws MappingException { if ( className == null ) return null; return ReflectHelper.reflectedPropertyClass( className, propertyName ); } public static void bindComposite(Element node, Component component, String path, boolean isNullable, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { bindComponent( node, component, null, null, path, isNullable, false, mappings, inheritedMetas, false ); } public static void bindCompositeId(Element node, Component component, PersistentClass persistentClass, String propertyName, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { component.setKey( true ); String path = StringHelper.qualify( persistentClass.getEntityName(), propertyName == null ? "id" : propertyName ); bindComponent( node, component, persistentClass.getClassName(), propertyName, path, false, node.attribute( "class" ) == null && propertyName == null, mappings, inheritedMetas, false ); if ( "true".equals( node.attributeValue("mapped") ) ) { if ( propertyName!=null ) { throw new MappingException("cannot combine mapped=\"true\" with specified name"); } Component mapper = new Component(persistentClass); bindComponent( node, mapper, persistentClass.getClassName(), null, path, false, true, mappings, inheritedMetas, true ); persistentClass.setIdentifierMapper(mapper); Property property = new Property(); property.setName("_identifierMapper"); property.setNodeName("id"); property.setUpdateable(false); property.setInsertable(false); property.setValue(mapper); property.setPropertyAccessorName( "embedded" ); persistentClass.addProperty(property); } } public static void bindComponent( Element node, Component component, String ownerClassName, String parentProperty, String path, boolean isNullable, boolean isEmbedded, Mappings mappings, java.util.Map inheritedMetas, boolean isIdentifierMapper) throws MappingException { component.setEmbedded( isEmbedded ); component.setRoleName( path ); inheritedMetas = getMetas( node, inheritedMetas ); component.setMetaAttributes( inheritedMetas ); Attribute classNode = isIdentifierMapper ? null : node.attribute( "class" ); if ( classNode != null ) { component.setComponentClassName( getClassName( classNode, mappings ) ); } else if ( "dynamic-component".equals( node.getName() ) ) { component.setDynamic( true ); } else if ( isEmbedded ) { // an "embedded" component (composite ids and unique) // note that this does not handle nested components if ( component.getOwner().hasPojoRepresentation() ) { component.setComponentClassName( component.getOwner().getClassName() ); } else { component.setDynamic(true); } } else { // todo : again, how *should* this work for non-pojo entities? if ( component.getOwner().hasPojoRepresentation() ) { Class reflectedClass = reflectedPropertyClass( ownerClassName, parentProperty ); if ( reflectedClass != null ) { component.setComponentClassName( reflectedClass.getName() ); } } else { component.setDynamic(true); } } String nodeName = node.attributeValue( "node" ); if ( nodeName == null ) nodeName = node.attributeValue( "name" ); if ( nodeName == null ) nodeName = component.getOwner().getNodeName(); component.setNodeName( nodeName ); Iterator iter = node.elementIterator(); while ( iter.hasNext() ) { Element subnode = (Element) iter.next(); String name = subnode.getName(); String propertyName = getPropertyName( subnode ); String subpath = propertyName == null ? null : StringHelper .qualify( path, propertyName ); CollectionType collectType = CollectionType.collectionTypeFromString( name ); Value value = null; if (
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -