spring配置hibernate映射文件的几种方式
在spring中配置hibernate时,即在配置sessionFactory时,
我们一般这样配置:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.query.substitutions">true=1,false=0</prop>
<prop key="hibernate.jdbc.batch_size">25</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.region_prefix">direct</prop>
<prop key="hibernate.cache.use_structured_entries">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
</props>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/org/first/config/</value>
<value>classpath:/org/second/config/</value>
</list>
</property>
</bean>
关于Hibernate的映射文件可以有多重配置方式,看一下org.springframework.orm.hibernate3.LocalSessionFactoryBean
这个类的源码就知道了,这里我截取部分变量。
private Class configurationClass;
private Resource configLocations[];
private String mappingResources[];
private Resource mappingLocations[];
private Resource cacheableMappingLocations[];
private Resource mappingJarLocations[];
private Resource mappingDirectoryLocations[];
private Properties hibernateProperties;
private TransactionManager jtaTransactionManager;
private Object cacheRegionFactory;
private CacheProvider cacheProvider;
private LobHandler lobHandler;
private Interceptor entityInterceptor;
private NamingStrategy namingStrategy;
private TypeDefinitionBean typeDefinitions[];
private FilterDefinition filterDefinitions[];
private Properties entityCacheStrategies;
private Properties collectionCacheStrategies;
private Map eventListeners;
private boolean schemaUpdate;
private ClassLoader beanClassLoader;
private Configuration configuration;
关于映射文件的配置有4个变量可以spring注入:
private String mappingResources[];
private Resource mappingLocations[];
private Resource mappingJarLocations[];
private Resource mappingDirectoryLocations[];
现在我们就开始研究怎么使用者4中方式以及4种方式的区别。
mappingResources方式:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.query.substitutions">true=1,false=0</prop>
<prop key="hibernate.jdbc.batch_size">25</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.generate_statistics">false</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.region_prefix">direct</prop>
<prop key="hibernate.cache.use_structured_entries">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
</props>
</property>
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>classpath:/org/first/config/context_first.xml</value>
<value>classpath:/org/second/config/context_second.xml</value>
</list>
</property>
</bean>
上面的配置会报错,提示找不到文件
改成下面后正常启动:
<property name="mappingResources">
<list>
<value>/org/first/config/LsyUser.hbm.xml</value>
<value>/org/second/config/LsyDep.hbm.xml</value>
</list>
</property>
这个有点奇怪了,因为我的xml文件时放在源文件夹中的,应该在路径前添加classpath:才正确。
实验的结果却报错,而不加classpath:的反而正确,我的结论:mappingResources这个属性就是要到
classpath下寻找文件,所以写上它反而错。
还有一点路径中<value>/org/first/config/LsyUser.hbm.xml</value>第一个"/"斜杠对于mappingResources
是不用写的,写了也不会报错。原因是spring自己过滤掉了第一个斜杠。
源码:
if(mappingResources != null)
{
String as[];
int j2 = (as = mappingResources).length;
for(int k = 0; k < j2; k++)
{
String mapping = as[k];
Resource resource = new ClassPathResource(mapping.trim(), beanClassLoader);
config.addInputStream(resource.getInputStream());
}
}
其中ClassPathResource源码:
public ClassPathResource(String path, ClassLoader classLoader)
{
Assert.notNull(path, "Path must not be null");
String pathToUse = StringUtils.cleanPath(path);
if(pathToUse.startsWith("/"))
pathToUse = pathToUse.substring(1);
this.path = pathToUse;
this.classLoader = classLoader == null ? ClassUtils.getDefaultClassLoader() : classLoader;
}
关于 classpath: 和 classpath*: 的区别,网上有篇文章介绍的很好:
Spring加载resource时classpath*:与classpath:的区别
http://blog.csdn.net/kkdelta/article/details/5507799
mappingLocations方式:
把sessionFactory中的<property name="mappingResources">替换成:
<property name="mappingLocations">
<list>
<value>classpath:/org/first/config/LsyUser.hbm.xml</value>
<value>classpath:/org/second/config/LsyDep.hbm.xml</value>
</list>
</property>
正常启动,可见这个mappingLocations是需要添加classpath:属性的,它的类型不是String,而是
Resource。使用它也可以到文件路径下配置(这里我们把xml文件放到了源文件夹中)。
(注意:url中第一个斜杠"/"同样可以省略。)
现在测试文件路径下的加载:
把上面2个文件放到/webapp/WEB-INF/hixml下,同时改变配置如下:
<property name="mappingLocations">
<list>
<value>/WEB-INF/hixml/LsyUser.hbm.xml</value>
<value>/WEB-INF/hixml/LsyDep.hbm.xml</value>
</list>
</property>
启动成功!
(注:第一个斜杠"/"可以省略)。
也就是说mappingLocations方式可以加载源文件夹中的文件(加前缀classpath:),
也可以加载物理路径中的文件。而mappingResources方式只能加载源文件夹中的文件
(注意:不能加前缀classpath:)。
还有对于url可以使用通配符,如下同上:
<property name="mappingLocations">
<list>
<value>/WEB-INF/hixml/*.hbm.xml</value>
</list>
</property>
mappingJarLocations方式:
这个方式是加载jar里面的文件,感觉不是很常用,不做研究了。
mappingDirectoryLocations方式:
这种方式是加载某个路径下的所有文件。
如下:
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/org/first/config/</value>
<value>classpath:/org/second/config/</value>
</list>
</property>
也可以加载物理路径下的文件,如下同上:
<property name="mappingDirectoryLocations">
<list>
<value>/WEB-INF/hixml</value>
</list>
</property>
*************************总结******************************************
清楚了以上4中方式,对于我们设计整个工程的架构是很有帮助的。
我们可以把所有Hibernate文件放在一个目录下,这样的好处就是不用每次
做新功能都要记得把新文件引入,也不用担心引入的时候写错了url,缺点就是
模块没有做到松耦合。我喜欢把配置文件都放在每个模块的package中,这样就
需要从源文件夹中引入,每个模块的所有代码都是在一块的也方面寻找代码。
分享到:
相关推荐
1. **依赖注入(Dependency Injection,DI)**:Spring通过XML配置或注解方式,将Hibernate的相关组件如SessionFactory、Session等注入到需要使用它们的类中,避免了手动创建和管理这些对象。 2. **事务管理...
解压后,可以通过IDE导入项目,查看其配置文件、实体类、映射文件以及测试用例,学习和理解Spring与Hibernate的整合过程。这种集成有助于提升开发效率,降低系统的复杂性,同时也为应用程序的扩展和维护提供了便利。...
2. **配置SessionFactory**: 在Spring配置文件中,使用`LocalSessionFactoryBean`定义SessionFactory的配置,指定之前创建的`hibernate.cfg.xml`文件位置。 3. **配置HibernateTemplate**: Spring通过`...
综上,"hibernate+spring配置文件"的配置涉及多个层面,包括Spring的IoC、事务管理、数据源配置,以及Hibernate的SessionFactory、实体映射等。理解并正确配置这些元素是成功整合SSH的关键,也是提升开发效率和系统...
4. **配置Spring MVC**:创建servlet-context.xml文件,配置Spring MVC的相关组件,如DispatcherServlet、视图解析器、模型视图、拦截器等。这里需要定义Controller扫描路径,以便Spring MVC能找到处理请求的控制器...
整合SSH涉及到的主要配置文件有`struts2-spring-plugin.xml`、`spring-context.xml`以及Hibernate的相关配置文件(如`hibernate.cfg.xml`)。`struts2-spring-plugin.xml`配置Struts2与Spring的集成,确保Action类由...
- `applicationContext.xml`:Spring 配置文件,配置了数据库连接、事务管理器、以及对 Hibernate SessionFactory 的配置。 - `struts-config.xml`:Struts 配置文件,定义了 Action 和 ActionForm 的映射。 **开发...
Struts、Spring 和 Hibernate 是Java Web开发中的三大框架,它们结合使用可以构建高效、模块化的应用程序,特别是对于处理用户登录和文件上传等常见功能。在这个项目中,"struts+spring+hibernate(mysql)用户登录及...
Hibernate4是Java领域主流的对象关系映射(Object-Relational Mapping, ORM)框架,它简化了数据库操作,使开发者可以使用面向对象的方式处理数据。在Spring4中整合Hibernate4,可以利用Spring的Transaction ...
在"25_黑马程序员_黎活明_Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境.avi"这个文件中,可能详细演示了如何配置这些库到项目的类路径中。 接着,需要配置Spring的IoC容器。这可以通过XML配置文件完成...
4. 实体类和数据库表映射:使用 Hibernate 的注解或 XML 映射文件,将 Java 类与数据库表关联起来。 5. DAO 层:创建 DAO 接口和实现类,使用 Hibernate 的 API 进行数据库操作,例如 CRUD(创建、读取、更新、删除...
"spring3hibernate4ehcache"这个压缩包文件很可能包含了实际项目的源代码,包括Spring、Hibernate和Ehcache的配置文件,以及相关的Java代码。通过分析这些代码,可以更深入地理解它们是如何协同工作的。 总结,...
Struts2-Spring4-Hibernate4 XML配置的框架是一个经典的Java Web开发架构,它整合了三个主流的开源框架:Struts2、Spring4和Hibernate4。这个框架的配置主要通过XML文件来完成,同时也可以结合注解的方式进行更加...
为了整合SpringMVC、Spring和Hibernate,你需要在Spring的配置文件中引入Hibernate的相关配置,如数据源、SessionFactory以及事务管理器。同时,你还需要配置一个Hibernate的本地SessionFactory Bean,以便Spring...
"可能还有些小地方需要修改才可以使用"暗示了这个示例可能并不完全可运行,需要开发者根据自己的环境进行一些调整,例如数据库连接配置、实体类的定义、持久化映射文件(Hibernate的.hbm.xml或使用注解的方式)等。...
通过源码,你可以看到如何配置Spring的ApplicationContext,SpringMVC的DispatcherServlet,以及如何在Hibernate中设置实体类和映射文件,理解数据访问对象(DAO)和业务服务层的设计模式。 6. **实践应用**:在...
2. 配置Hibernate:创建hibernate.cfg.xml文件,设置JDBC连接、方言、缓存等。 3. 定义实体类:每个实体类对应数据库表,使用@Entity、@Table、@Id等注解。 4. 创建SessionFactory:通过Configuration实例化...
通过理解并正确配置这三个框架的文件,开发者可以创建一个高效的Java Web应用程序,利用Struts2的MVC模式、Spring的依赖注入和事务管理,以及Hibernate的对象关系映射能力,从而实现业务逻辑与视图、持久层的解耦,...
- 接下来,我们需要添加 Hibernate 支持,选择 Spring 配置文件来生成 Hibernate 配置。在这个过程中,IDE 会自动生成 `SessionFactory` 的配置,我们需要为其指定一个唯一的名称。 4. **配置 DataSource**: - ...
首先,Spring4是一个全面的Java应用程序框架,它提供了一种方式来管理组件(或称为bean)之间的依赖关系,以此来实现控制反转(IoC)和面向切面编程(AOP)。Spring4还提供了对数据访问、Web应用、事务管理等的支持...