hibernate-mapping-3.0.dtd问题.

Hbm.xml文件中引用了hibernate-mapping-3.0.dtd,
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

当机器不能上网的时候程序运行就出现错误,说找不到hibernate-mapping-3.0.dtd,这个文件可以放到本地吗?放到什么位置?
 

 

Hibernate 在load mapping文件的时候根本就没有连到http://hibernate.sourceforge.net去,而是在本地classpath的org/hibernate/目录去找DTD文件,所以根本不存在不能上网就找不到DTD文件的问题啊!
只要你的hibernate.jar包的org/hibernate/目录包含了DTD文件就OK了啊.
hibernate默认用DTDEntityResolver作为EntityResolve
其load DTD文件的方法如下:


代码
 
public InputSource resolveEntity (String publicId, String systemId) {
  if ( systemId!=null && systemId.startsWith(URL) ) {
   log.debug("trying to locate " + systemId + " in classpath under org/hibernate/");
   // Search for DTD
   String path = "org/hibernate/" + systemId.substring( URL.length() );
   InputStream dtdStream = resourceLoader==null ?
     getClass().getResourceAsStream(path) :
     resourceLoader.getResourceAsStream(path);
   if (dtdStream==null) {
    log.debug(systemId + " not found in classpath");
    return null;
   }
   else {
    log.debug("found " + systemId + " in classpath");
    InputSource source = new InputSource(dtdStream);
    source.setPublicId(publicId);
    source.setSystemId(systemId);
    return source;
   }
  }
  else {
   // use the default behaviour
   return null;
  }
 }

当然,如果你是要自己写函数来调用hbm.xml文件
那就像cm4ever说的那样
SAXReader reader=new SAXReader();
reader.setEntityResolver(new DTDEntityResolver());
就可以了:)

 

你可能感兴趣的:(work.log)