I think this is a bug - there have been several posts related to this
issue.  If you could open a JIRA issue and attach a patch it would be
great.

Jeff


On Thu, Dec 11, 2008 at 6:14 AM, Michael He <[EMAIL PROTECTED]> wrote:
>
> Hi all
>
>      I currently use ibatis-2.3.4 and find that the <settings> element in
> SqlMapConfig.xml shouldn't missed if you want the default  settings in this
> tag to take effect even if you don't put any attributes in it.In other
> words,if you don't leave the <settings> element in SqlMapConfig.xml,all the
> boolean attributes(like cacheModelsEnabled,lazyLoadingEnabled) will be false
> instead of the default value as said by the
> docs(cacheModelsEnabled,lazyLoadingEnabled are both setted as true defaultly
> according to the docs) .
>
>      I digged into the source code,trying to find the reason and may be i
> have located the problem :)
>
>  ibatis uses the SqlMapConfigParser class to load the SqlMapConfig file ,for
> example ,the code below parse the SqlMapConfig file as a reader:
>
>    public static SqlMapClient buildSqlMapClient(Reader reader) {
> //    return new XmlSqlMapClientBuilder().buildSqlMap(reader);
>    return new SqlMapConfigParser().parse(reader);
>  }
>
>   ibatis actually uses a customed parser called the NodeletParser to parse
> xml nodes,i paste the comments of this parser below:
> /**
>  * The NodeletParser is a callback based parser similar to SAX.  The big
>  * difference is that rather than having a single callback for all nodes,
>  * the NodeletParser has a number of callbacks mapped to
>  * various nodes.   The callback is called a Nodelet and it is registered
>  * with the NodeletParser against a specific XPath.
>  */
>
>  when SqlMapConfigParser is first initialized,it will store all the
> Xpath(predifined xpathes for all the elements in the SqlMapConfig file) and
> Nodelet as the key-value pair in a hashmap in NodeletParser class for
> possible processes in the future.
>  The SqlMapConfig will be parsed by calling the parse(reader) method,the
> NodeletParser will use a recursive method that walkes the DOM tree,
> registers XPaths and calls Nodelets registered under those XPaths.
> The process method in the codes below  nodelet.process(node) actually
> processes all the elments and their children.
>
>  private void processNodelet(Node node, String pathString) {
>    Nodelet nodelet = (Nodelet) letMap.get(pathString);
>    if (nodelet != null) {
>      try {
>        nodelet.process(node);
>      } catch (Exception e) {
>        throw new RuntimeException("Error parsing XPath '" + pathString +
> "'.  Cause: " + e, e);
>      }
>    }
>  }
>
> the process method for setting element is below,as you can see ,the
> attribute like setLazyLoadingEnabled is setted as true if you don't specify
> the value
>
> public void process(Node node) throws Exception {
>                                Properties attributes = 
> NodeletUtils.parseAttributes(node,
>                                                state.getGlobalProps());
>                                SqlMapConfiguration config = state.getConfig();
>
>                                String classInfoCacheEnabledAttr = attributes
>                                                
> .getProperty("classInfoCacheEnabled");
>                                boolean classInfoCacheEnabled = 
> (classInfoCacheEnabledAttr == null ||
> "true"
>                                                
> .equals(classInfoCacheEnabledAttr));
>                                
> config.setClassInfoCacheEnabled(classInfoCacheEnabled);
>
>                                String lazyLoadingEnabledAttr = attributes
>                                                
> .getProperty("lazyLoadingEnabled");
>                                boolean lazyLoadingEnabled = 
> (lazyLoadingEnabledAttr == null || "true"
>                                                
> .equals(lazyLoadingEnabledAttr));
>                                
> config.setLazyLoadingEnabled(lazyLoadingEnabled);
>
>                                String statementCachingEnabledAttr = attributes
>                                                
> .getProperty("statementCachingEnabled");
>                                boolean statementCachingEnabled = 
> (statementCachingEnabledAttr == null
> || "true"
>                                                
> .equals(statementCachingEnabledAttr));
>                                
> config.setStatementCachingEnabled(statementCachingEnabled);
>
>                                String cacheModelsEnabledAttr = attributes
>                                                
> .getProperty("cacheModelsEnabled");
>                                boolean cacheModelsEnabled = 
> (cacheModelsEnabledAttr == null || "true"
>                                                
> .equals(cacheModelsEnabledAttr));
>                                
> config.setCacheModelsEnabled(cacheModelsEnabled);
>
>                                String enhancementEnabledAttr = attributes
>                                                
> .getProperty("enhancementEnabled");
>                                boolean enhancementEnabled = 
> (enhancementEnabledAttr == null || "true"
>                                                
> .equals(enhancementEnabledAttr));
>                                
> config.setEnhancementEnabled(enhancementEnabled);
>
>                                String useColumnLabelAttr = attributes
>                                                .getProperty("useColumnLabel");
>                                boolean useColumnLabel = (useColumnLabelAttr 
> == null || "true"
>                                                .equals(useColumnLabelAttr));
>                                config.setUseColumnLabel(useColumnLabel);
>
>                                String forceMultipleResultSetSupportAttr = 
> attributes
>                                                
> .getProperty("forceMultipleResultSetSupport");
>                                boolean forceMultipleResultSetSupport = "true"
>                                                
> .equals(forceMultipleResultSetSupportAttr);
>                                config
>                                                
> .setForceMultipleResultSetSupport(forceMultipleResultSetSupport);
>
>                                String defaultTimeoutAttr = attributes
>                                                
> .getProperty("defaultStatementTimeout");
>                                Integer defaultTimeout = defaultTimeoutAttr == 
> null ? null
>                                                : 
> Integer.valueOf(defaultTimeoutAttr);
>                                
> config.setDefaultStatementTimeout(defaultTimeout);
>
>                                String useStatementNamespacesAttr = attributes
>                                                
> .getProperty("useStatementNamespaces");
>                                boolean useStatementNamespaces = "true"
>                                                
> .equals(useStatementNamespacesAttr);
>                                
> state.setUseStatementNamespaces(useStatementNamespaces);
>                        }
> so if there's no setting element in the config file,it will not be found in
> the hashMap,so the nodelet will be null and the process(node) method will
> not be called,thus all the setting attributes will be the default boolean
> value false.That's where the problem is.
>
> I'm a newbie so may be i have missed something or have made something
> wrong,if I have, please let me know ,any help and comment will be
> appreciated.
>
> --
> View this message in context: 
> http://www.nabble.com/Is-this-a-bug---tp20954288p20954288.html
> Sent from the iBATIS - User - Java mailing list archive at Nabble.com.
>
>

Reply via email to