如何让Hibernate离线运行,避免在线下载DTD与校验Schema?
Hey there, let's tackle your two Hibernate offline configuration questions clearly and practically!
1. 配置Hibernate支持离线使用DTD
Hibernate默认联网下载DTD的行为确实有点烦人,尤其是在网络不稳定的环境下。这里有两种可靠的方法让它离线运行:
方法一:直接修改DOCTYPE引用为本地资源
首先,把对应的Hibernate DTD文件(比如hibernate-mapping-3.0.dtd、hibernate-configuration-3.0.dtd)下载到你的项目类路径下,推荐放在src/main/resources/hibernate/dtd/这类结构化目录里。
然后把配置文件里的DOCTYPE URL替换成类路径引用,比如:
classpath:前缀会告诉Hibernate直接从项目的类路径(编译后的resources目录)里加载DTD,完全不需要联网。
方法二:通过Hibernate属性强制离线模式
在你的hibernate.cfg.xml配置文件中添加以下属性,让Hibernate优先从本地查找DTD,彻底跳过联网步骤:
<property name="hibernate.dtd.lookup_in_file_system">true</property> <property name="hibernate.dtd.lookup_in_classpath">true</property>
lookup_in_file_system:开启后会先在本地文件系统查找DTDlookup_in_classpath:开启后会优先从类路径加载DTD
配合方法一使用的话,就能完全确保离线运行了。
2. 调整映射配置实现离线Schema校验
针对你给出的这段映射配置:
只需要两步就能改成离线模式:
下载DTD文件:从Hibernate依赖包或官方渠道找到
hibernate-mapping-3.0.dtd,放到项目的类路径目录下,比如src/main/resources/dtd/。修改DOCTYPE的URL:把远程URL替换成本地类路径引用(推荐)或者本地文件路径:
- 类路径方式(打包后依然有效):
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "classpath:/dtd/hibernate-mapping-3.0.dtd"> - 本地文件路径(适合开发环境,用绝对路径):
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "file:///Users/yourname/projects/your-project/src/main/resources/dtd/hibernate-mapping-3.0.dtd">
- 类路径方式(打包后依然有效):
这样调整后,Hibernate在做Schema校验时就会从本地加载DTD,不会再触发在线请求了。
内容的提问来源于stack exchange,提问作者michealAtmi

