背景:项目中需要对业务中的某些HQL语句做一些预处理,因此必须在分析HQL语句的过程中能够根据Java的反射机制动态获知某些实体类的信息。例如:from Person where name like '%张%',我们必须设法根据Person能够加载它对应的实体类。
想来想去还是在将*.hbm.xml这些配置文件交给spring的LocalSessionFactoryBean处理之前最好我们自己的系统能先处理一下,以便缓存某些配置信息以备需要的时候能够方便的取到。
首先要解决的一点就是spring中配置SessionFactory的Bean不能像下面这样定义了:
<bean id="unieapSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="unieapDatasource" />
</property>
<property name="mappingResources">
<list>
<value>com/neuqsoft/czgs/common/entity/Demo.hbm.xml</value>
<value>com/neuqsoft/czgs/common/entity/PERSON.hbm.xml</value>
……
</list>
</property>
</bean>
原因在于如果这样定义的话我们的系统无法截取实体配置文件这些资源文件,为了解决这个问题我很自然地想到了spring中的FactoryBean这个接口,于是下面的类应运而生了。
public class HibernateMappingResourceFactoryBean implements FactoryBean {
private List _list;
public Object getObject() throws Exception {
return _list;
}
public Class getObjectType() {
return List.class;
}
public boolean isSingleton() {
return true;
}
public void set_list(List _list) {
this._list = _list;
EntityManager.getInstance().registerAll(_list);
}
}
它的作用有两个:一是用于配置一个List的实例bean,二是将List中的所有资源文件注册到EntityManager中,有关EntityManager我们稍后会提到它的作用。
需要指出的是,使用spring可以很方便地向某个Bean中注入List类型的属性(通过list元素),但却不能简单地配置一个类型为List的Bean,所以我们这里利用FactoryBean接口以及list元素来达到可以配置一个List类型的Bean的目的。
HibernateMappingResourceFactoryBean以及LocalSessionFactoryBean在spring中的配置片段如下。
<bean id="bizHibernateMappingResource" class="HibernateMappingResourceFactoryBean">
<property name="_list">
<list>
<value>com/neuqsoft/czgs/common/entity/Demo.hbm.xml</value>
<value>com/neuqsoft/czgs/common/entity/PERSON.hbm.xml</value>
……
</list>
</property>
</bean>
<bean id="unieapSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="unieapDatasource" />
</property>
<property name="mappingResources" ref="bizHibernateMappingResource"/>
</bean>
这样以来既不妨碍spring中的LocalSessionFactoryBean加载Hibernate的配置文件又不妨碍我们自己的系统加载这些配置文件,而且配置也较为简单,可谓一举两得。
但是接下来在解析XML的过程中我却又遇到了麻烦,总是报告java.net.ConnectException: Connection timed out: connect 错误,可以肯定这是由于网络连接引起的,上班时间我们公司不能上外网,问题是解析XML文件究竟和网络连接有什么关系呢?
要找出错误的原因还得从源代码查起,下面是EntityManager类中registerAll方法的源代码(修改前)。
public void registerAll(List resourceList){
if(resourceList!=null){
try{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder=factory.newDocumentBuilder();
for(int i=0;i<resourceList.size();i++){
String resourcePath=(String)resourceList.get(i);
try{
URL url=getResource(resourcePath);
File is=new File(url.getFile());
org.w3c.dom.Document w3cDocument=builder.parse(is);
DOMReader reader=new DOMReader();
Document document=reader.read(w3cDocument);
parseDocument(document);
}catch(Exception e){
throw new RuntimeException("Error:"+resourcePath,e);
}
}
}catch(ParserConfigurationException e){
e.printStackTrace();
} catch (FactoryConfigurationError e) {
e.printStackTrace();
}
}
}
错误是从org.w3c.dom.Document w3cDocument=builder.parse(is);这一行开始的,无疑是解析XML的错误了,为了彻底弄清楚错误的原因,我打开一个实体配置文件(Demo.hbm.xml)仔细研究了一下,发现在文档类型定义中确实有URL:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
于是我猜想会不会是XML解析器在解析XML的时候发现文档类型定义中的systemId是URL,那么就会尝试建立连接以便通过连接读取DTD的内容呢,如果是这样的话,那么等下班后能够上网了,这个问题就应该消失,巧的是正在这时下班的时间到了,于是我开始重新启动服务器,一切尽在意料之中,错误消失了。
现在的问题是上班的时间怎么办,有没有一种机制可以改变XML解析器分析文档类型定义时默认的行为呢,答案是肯定的,那就是通过定制实体解析器来改变其默认的行为。我首先把Hibernate的文档类型定义hibernate-mapping-3.0.dtd这个文件拷贝到我们的工程的类路径中,接下来将EntityManager中的registerAll方法改成下面这样,上班的时候启动服务器也不会报网络连接异常这样可恶的错误了。
public void registerAll(List resourceList){
if(resourceList!=null){
try{
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder=factory.newDocumentBuilder();
builder.setEntityResolver(new EntityResolver(){
public InputSource resolveEntity(String publicID, String systemID)
throws SAXException, IOException {
InputStream is=getClass().getResourceAsStream("hibernate-mapping-3.0.dtd");
return new InputSource(is);
}
});
for(int i=0;i<resourceList.size();i++){
String resourcePath=(String)resourceList.get(i);
try{
URL url=getResource(resourcePath);
File is=new File(url.getFile());
org.w3c.dom.Document w3cDocument=builder.parse(is);
DOMReader reader=new DOMReader();
Document document=reader.read(w3cDocument);
parseDocument(document);
}catch(Exception e){
throw new RuntimeException("Error:"+resourcePath,e);
}
}
}catch(ParserConfigurationException e){
e.printStackTrace();
} catch (FactoryConfigurationError e) {
e.printStackTrace();
}
}
}
The article is end.
分享到:
相关推荐
- Socket通信过程中可能会出现各种异常,如`IOException`、`ConnectException`等,需要妥善处理这些异常,确保程序的健壮性。 6. **文件传输** 在实际应用中,Socket通信可能涉及到文件的上传或下载。可以通过流...
功能说明: 本系统主要包括以下功能模块:个人中心,通知公告管理,用户管理,工作人员管理,进门登记管理,出门登记管理,出入统计管理,外来登记管理等模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
PartSegCore_compiled_backend-0.12.0a0-cp36-cp36m-win_amd64.whl.rar
yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip;yolo算法-分神驾驶数据集-8674张图像带标签-没有安全带-唤醒-昏昏欲睡-安全带-电话-打哈欠.zip
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
中国省级与地级市财政转移支付数据-最新.zip
OPENCV 常用XML 内涵17个常用XML,包括人脸检测,微笑检测,人眼检测,用于学习模型训练和使用
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
开发语言:Java 框架:SSM JDK版本:JDK1.8 服务器:tomcat8.5 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 浏览器:谷歌浏览器
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
中国各省GDP及农业主要指标数据集(1999-2019).zip
功能说明: 系统主要包括系统主页、个人中心、用户管理、图书信息管理、图书分类管理、图书购买管理、图书借阅管理、图书续借管理、图书归还管理、留言板管理、系统管理等功能模块。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
2023-04-06-项目笔记-第三百二十阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.318局变量的作用域_318- 2024-11-17
Saturn_PCB_Toolkit_V7.00_ 是一款功能强大的PCB参数计算工具,本人PCB设计15年一直使用的这款计算器,利用其给出的设计数据(如线距、线宽线厚),布出的PCB实际使用未曾出现过问题 以下是其主要功能特点: 1. **过孔特性计算**:能够计算过孔的寄生电容、寄生电感、过孔阻抗、过孔直流电阻、共振频率、阶跃响应、功耗等参数。 2. **导线载流能力计算**:可以计算不同线宽下的载流能力,根据环境温度和温升条件,提供不同条件下的载流值。 3. **串扰计算**:计算两相互耦合信号线间的串扰,这对于高速PCB设计尤为重要。 4. **波长计算**:提供波长的计算功能,这对于射频和高速数字PCB设计非常关键。 5. **导体阻抗计算**:计算导体的阻抗,这对于阻抗匹配和信号完整性至关重要。 6. **单位换算**:提供单位换算功能,方便不同单位制之间的转换。 7. **差分对计算**:针对差分信号的计算,这对于高速数据传输和降低噪声非常重要。
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
## 一、数据介绍 数据名称:中国各、省、市、县、乡镇基尼系数数据 数据年份:1992-2023年 样本数量:92064条 数据格式:面板数据 ## 二、指标说明 共计10个指标:年份、省、省代码、市、市代码、县、县代码、乡镇、乡镇代码、夜间灯光基尼系数 ## 三、数据文件 中国各乡镇基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各区县基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各城市基尼系数(基于夜间灯光数据)2000-2023年.dta; 中国各省份基尼系数(基于夜间灯光数据)2000-2023年.dta
环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
功能说明: 系统主要包括管理员,商家和用户三大模块 (a) 管理员;管理员进入系统主要功能包括个人中心,用户管理,商家管理,用品分类管理,用品信息管理,系统管理,订单管理等功能并进行操作。 (b) 商家;商家进入系统主要功能包括个人中心,用品信息管理,订单管理等功能并进行操作。 (c) 用户;用户进入系统主要功能包括个人中心,我的收藏管理等功能并进行操作。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上