📄 hbmbinder.java
字号:
// } // } // else { // bindSimpleValue( idNode, id, false, propertyName, mappings ); // PojoRepresentation pojo = entity.getPojoRepresentation(); // id.setTypeUsingReflection( pojo.getClassName(), propertyName ); // // Property prop = new Property(); // prop.setValue( id ); // bindProperty( idNode, prop, mappings, inheritedMetas ); // entity.setIdentifierProperty( prop ); // } if ( propertyName == null ) { bindSimpleValue( idNode, id, false, RootClass.DEFAULT_IDENTIFIER_COLUMN_NAME, mappings ); } else { bindSimpleValue( idNode, id, false, propertyName, mappings ); } if ( propertyName == null || !entity.hasPojoRepresentation() ) { if ( !id.isTypeSpecified() ) { throw new MappingException( "must specify an identifier type: " + entity.getEntityName() ); } } else { id.setTypeUsingReflection( entity.getClassName(), propertyName ); } if ( propertyName != null ) { Property prop = new Property(); prop.setValue( id ); bindProperty( idNode, prop, mappings, inheritedMetas ); entity.setIdentifierProperty( prop ); } // TODO: /* * if ( id.getHibernateType().getReturnedClass().isArray() ) throw new MappingException( * "illegal use of an array as an identifier (arrays don't reimplement equals)" ); */ makeIdentifier( idNode, id, mappings ); } private static void bindCompositeId(Element idNode, RootClass entity, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { String propertyName = idNode.attributeValue( "name" ); Component id = new Component( entity ); entity.setIdentifier( id ); bindCompositeId( idNode, id, entity, propertyName, mappings, inheritedMetas ); if ( propertyName == null ) { entity.setEmbeddedIdentifier( id.isEmbedded() ); if ( id.isEmbedded() ) { // todo : what is the implication of this? id.setDynamic( !entity.hasPojoRepresentation() ); /* * Property prop = new Property(); prop.setName("id"); * prop.setPropertyAccessorName("embedded"); prop.setValue(id); * entity.setIdentifierProperty(prop); */ } } else { Property prop = new Property(); prop.setValue( id ); bindProperty( idNode, prop, mappings, inheritedMetas ); entity.setIdentifierProperty( prop ); } makeIdentifier( idNode, id, mappings ); } private static void bindVersioningProperty(Table table, Element subnode, Mappings mappings, String name, RootClass entity, java.util.Map inheritedMetas) { String propertyName = subnode.attributeValue( "name" ); SimpleValue val = new SimpleValue( table ); bindSimpleValue( subnode, val, false, propertyName, mappings ); if ( !val.isTypeSpecified() ) { // this is either a <version/> tag with no type attribute, // or a <timestamp/> tag if ( "version".equals( name ) ) { val.setTypeName( "integer" ); } else { if ( "db".equals( subnode.attributeValue( "source" ) ) ) { val.setTypeName( "dbtimestamp" ); } else { val.setTypeName( "timestamp" ); } } } Property prop = new Property(); prop.setValue( val ); bindProperty( subnode, prop, mappings, inheritedMetas ); // for version properties marked as being generated, make sure they are "always" // generated; aka, "insert" is invalid; this is dis-allowed by the DTD, // but just to make sure... if ( prop.getGeneration() == PropertyGeneration.INSERT ) { throw new MappingException( "'generated' attribute cannot be 'insert' for versioning property" ); } makeVersion( subnode, val ); entity.setVersion( prop ); entity.addProperty( prop ); } private static void bindDiscriminatorProperty(Table table, RootClass entity, Element subnode, Mappings mappings) { SimpleValue discrim = new SimpleValue( table ); entity.setDiscriminator( discrim ); bindSimpleValue( subnode, discrim, false, RootClass.DEFAULT_DISCRIMINATOR_COLUMN_NAME, mappings ); if ( !discrim.isTypeSpecified() ) { discrim.setTypeName( "string" ); // ( (Column) discrim.getColumnIterator().next() ).setType(type); } entity.setPolymorphic( true ); if ( "true".equals( subnode.attributeValue( "force" ) ) ) entity.setForceDiscriminator( true ); if ( "false".equals( subnode.attributeValue( "insert" ) ) ) entity.setDiscriminatorInsertable( false ); } public static void bindClass(Element node, PersistentClass persistentClass, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { // transfer an explicitly defined entity name // handle the lazy attribute Attribute lazyNode = node.attribute( "lazy" ); boolean lazy = lazyNode == null ? mappings.isDefaultLazy() : "true".equals( lazyNode.getValue() ); // go ahead and set the lazy here, since pojo.proxy can override it. persistentClass.setLazy( lazy ); String entityName = node.attributeValue( "entity-name" ); if ( entityName == null ) entityName = getClassName( node.attribute("name"), mappings ); if ( entityName==null ) { throw new MappingException( "Unable to determine entity name" ); } persistentClass.setEntityName( entityName ); bindPojoRepresentation( node, persistentClass, mappings, inheritedMetas ); bindDom4jRepresentation( node, persistentClass, mappings, inheritedMetas ); bindMapRepresentation( node, persistentClass, mappings, inheritedMetas ); bindPersistentClassCommonValues( node, persistentClass, mappings, inheritedMetas ); } private static void bindPojoRepresentation(Element node, PersistentClass entity, Mappings mappings, java.util.Map metaTags) { String className = getClassName( node.attribute( "name" ), mappings ); String proxyName = getClassName( node.attribute( "proxy" ), mappings ); entity.setClassName( className ); if ( proxyName != null ) { entity.setProxyInterfaceName( proxyName ); entity.setLazy( true ); } else if ( entity.isLazy() ) { entity.setProxyInterfaceName( className ); } Element tuplizer = locateTuplizerDefinition( node, EntityMode.POJO ); if ( tuplizer != null ) { entity.addTuplizer( EntityMode.POJO, tuplizer.attributeValue( "class" ) ); } } private static void bindDom4jRepresentation(Element node, PersistentClass entity, Mappings mappings, java.util.Map inheritedMetas) { String nodeName = node.attributeValue( "node" ); if (nodeName==null) nodeName = StringHelper.unqualify( entity.getEntityName() ); entity.setNodeName(nodeName); Element tuplizer = locateTuplizerDefinition( node, EntityMode.DOM4J ); if ( tuplizer != null ) { entity.addTuplizer( EntityMode.DOM4J, tuplizer.attributeValue( "class" ) ); } } private static void bindMapRepresentation(Element node, PersistentClass entity, Mappings mappings, java.util.Map inheritedMetas) { Element tuplizer = locateTuplizerDefinition( node, EntityMode.MAP ); if ( tuplizer != null ) { entity.addTuplizer( EntityMode.MAP, tuplizer.attributeValue( "class" ) ); } } /** * Locate any explicit tuplizer definition in the metadata, for the given entity-mode. * * @param container The containing element (representing the entity/component) * @param entityMode The entity-mode for which to locate the tuplizer element * @return The tuplizer element, or null. */ private static Element locateTuplizerDefinition(Element container, EntityMode entityMode) { Iterator itr = container.elements( "tuplizer" ).iterator(); while( itr.hasNext() ) { final Element tuplizerElem = ( Element ) itr.next(); if ( entityMode.toString().equals( tuplizerElem.attributeValue( "entity-mode") ) ) { return tuplizerElem; } } return null; } private static void bindPersistentClassCommonValues(Element node, PersistentClass entity, Mappings mappings, java.util.Map inheritedMetas) throws MappingException { // DISCRIMINATOR Attribute discriminatorNode = node.attribute( "discriminator-value" ); entity.setDiscriminatorValue( ( discriminatorNode == null ) ? entity.getEntityName() : discriminatorNode.getValue() ); // DYNAMIC UPDATE Attribute dynamicNode = node.attribute( "dynamic-update" ); entity.setDynamicUpdate( dynamicNode != null && "true".equals( dynamicNode.getValue() ) ); // DYNAMIC INSERT Attribute insertNode = node.attribute( "dynamic-insert" ); entity.setDynamicInsert( insertNode != null && "true".equals( insertNode.getValue() ) ); // IMPORT mappings.addImport( entity.getEntityName(), entity.getEntityName() ); if ( mappings.isAutoImport() && entity.getEntityName().indexOf( '.' ) > 0 ) { mappings.addImport( entity.getEntityName(), StringHelper.unqualify( entity.getEntityName() ) ); } // BATCH SIZE Attribute batchNode = node.attribute( "batch-size" ); if ( batchNode != null ) entity.setBatchSize( Integer.parseInt( batchNode.getValue() ) ); // SELECT BEFORE UPDATE Attribute sbuNode = node.attribute( "select-before-update" ); if ( sbuNode != null ) entity.setSelectBeforeUpdate( "true".equals( sbuNode.getValue() ) ); // OPTIMISTIC LOCK MODE Attribute olNode = node.attribute( "optimistic-lock" ); entity.setOptimisticLockMode( getOptimisticLockMode( olNode ) ); entity.setMetaAttributes( getMetas( node, inheritedMetas ) ); // PERSISTER Attribute persisterNode = node.attribute( "persister" ); if ( persisterNode != null ) { try { entity.setEntityPersisterClass( ReflectHelper.classForName( persisterNode .getValue() ) ); } catch (ClassNotFoundException cnfe) { throw new MappingException( "Could not find persister class: " + persisterNode.getValue() ); } } // CUSTOM SQL handleCustomSQL( node, entity ); Iterator tables = node.elementIterator( "synchronize" ); while ( tables.hasNext() ) { entity.addSynchronizedTable( ( (Element) tables.next() ).attributeValue( "table" ) ); } Attribute abstractNode = node.attribute( "abstract" ); Boolean isAbstract = abstractNode == null ? null : "true".equals( abstractNode.getValue() ) ? Boolean.TRUE : "false".equals( abstractNode.getValue() ) ? Boolean.FALSE : null; entity.setAbstract( isAbstract ); } private static void handleCustomSQL(Element node, PersistentClass model) throws MappingException { Element element = node.element( "sql-insert" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLInsert( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-delete" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLDelete( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-update" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLUpdate( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "loader" ); if ( element != null ) { model.setLoaderName( element.attributeValue( "query-ref" ) ); } } private static void handleCustomSQL(Element node, Join model) throws MappingException { Element element = node.element( "sql-insert" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLInsert( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-delete" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLDelete( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-update" ); if ( element != null ) { boolean callable = isCallable( element ); model.setCustomSQLUpdate( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } } private static void handleCustomSQL(Element node, Collection model) throws MappingException { Element element = node.element( "sql-insert" ); if ( element != null ) { boolean callable = isCallable( element, true ); model.setCustomSQLInsert( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-delete" ); if ( element != null ) { boolean callable = isCallable( element, true ); model.setCustomSQLDelete( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-update" ); if ( element != null ) { boolean callable = isCallable( element, true ); model.setCustomSQLUpdate( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } element = node.element( "sql-delete-all" ); if ( element != null ) { boolean callable = isCallable( element, true ); model.setCustomSQLDeleteAll( element.getTextTrim(), callable, getResultCheckStyle( element, callable ) ); } } private static boolean isCallable(Element e) throws MappingException { return isCallable( e, true ); } private static boolean isCallable(Element element, boolean supportsCallable) throws MappingException { Attribute attrib = element.attribute( "callable" ); if ( attrib != null && "true".equals( attrib.getValue() ) ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -