6) hibernate.session_factory_name:

配置一个JNDI名称,通过Configuration对象创建的SessionFactory会绑定到JNDI下该名称中。一般名字格式为jndi/someName。注意,要使用JNDI,需要在具有JNDI功能的环境之中,比如WEB容器或者EJB容器中。

下面再tomcat中做一个示例,首先在一个标准的WEB项目中添加hibernate的一些基本功能,接着在hibernate.properties文件中添加:

hibernate.session_factory_name jndi/sf

创建一个Filter作为Open Session In View过滤器:

public class OpenSessioninViewFilter implements Filter {
public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HibernateUtil.getInstance().getCurrentSession();
chain.doFilter(req, resp);
HibernateUtil.getInstance().closeSession();
} public void init(FilterConfig arg0) throws ServletException {}
}

在HibernatUtil类的创建过程中就初始化并创建了一个SessionFactory,那么该SessionFactory就已经绑定在了JNDI中Naming为jndi/sf上:

private HibernateUtil() {
sf = new Configuration().configure().buildSessionFactory(
new ServiceRegistryBuilder().buildServiceRegistry());
}

接着再创建一个Filter来验证JNDI是否绑定成功:

public class SomeFilter implements Filter {

public void destroy() {}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
try {
Context ctx = new InitialContext();
System.out.println(ctx.lookup("jndi/sf"));
} catch (Exception e) {
e.printStackTrace();
}
chain.doFilter(req, resp);
} public void init(FilterConfig arg0) throws ServletException {}
}

该Filter仅仅是很简单的从上下文中找到名字为jndi/sf的资源并打印出来。要能够正常打印,必须要保证open session in view 过滤器在该SomeFilter之前运行(主要的目的是要求在第一次使用JNDI查找SessionFactory资源之前完成SessionFactory的实例化):

<filter>
<filter-name>osiv</filter-name>
<filter-class>util.OpenSessioninViewFilter</filter-class>
</filter> <filter-mapping>
<filter-name>osiv</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <filter>
<filter-name>filter</filter-name>
<filter-class>util.SomeFilter</filter-class>
</filter> <filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

运行应用,随意请求一个地址,后台打印:

org.hibernate.internal.SessionFactoryImpl@6186ee4d

已经工作正常。注意一点的就是,如果只是在JUnit中测试Hibernate,在Hibernate启动过程当中就会看到这样的异常:

WARN: HHH000277: Could not bind factory to JNDI
org.hibernate.service.jndi.JndiException: Error parsing JNDI name [foo]
at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:92)
at org.hibernate.service.jndi.internal.JndiServiceImpl.bind(JndiServiceImpl.java:108)
at org.hibernate.internal.SessionFactoryRegistry.addSessionFactory(SessionFactoryRegistry.java:89)
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:480)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1750)
at cd.itcast.hibernate.day1.jdbc.HibernateUtil.(HibernateUtil.java:15)
at cd.itcast.hibernate.day1.jdbc.HibernateUtil.(HibernateUtil.java:10)
at cd.itcast.hibernate.day1.jdbc.UserTest.test(UserTest.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
... Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getNameParser(Unknown Source)
at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:86)
... 30 more

该异常并不影响Hibernate的正常使用,其原因是因为在hibernate的project/etc/中的hibernate.cfg.xml文件模板中,sessionFactory配置了name这个属性,这个属性同hibernate.session_factory_name作用相同,也是用于指定JNDI绑定名称,因为在JUNIT环境下没有JNDI功能,所以绑定失败,报错。要去掉这个异常,只需要把SessionFactory元素的name属性删除即可。

Hibernate 配置详解(2)的更多相关文章

  1. Hibernate 配置详解(9)

    hibernate.cache.use_structured_entries Hibernate文档上介绍,该属性是用于把对象以一种更易读的方式放到二级缓存中,这样,在对二级缓存进行监控的时候就更容易 ...

  2. Hibernate 配置详解(5)

    9) hibernate.batch_fetch_style: 该配置是hibernate4.2.0新添加的,使用这个设置可以配置hibernate在做batch-fetch的时候,生成SQL的策略. ...

  3. Hibernate 配置详解(8)

    hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...

  4. Hibernate 配置详解(12) 补充

    hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...

  5. Hibernate 配置详解(12) 其实我也不想用这么土的名字

    hibernate.hbm2ddl.import_files 这个配置用于在hibernate根据映射文件执行DDL之前,如果我们自己设置了要事先运行的SQL文件,hibernate就会先执行这些SQ ...

  6. Hibernate 配置详解(7)

    hibernate.order_updates: Hibernate文档中提到,该配置用于在刷新一级缓存,提交UPDATE的时候,按照每类对象的主键顺序排序后再提交,可以在高并发情况下减少事务死锁的可 ...

  7. Hibernate 配置详解(11)

    hibernate.session_factory_name_is_jndi 配置hibernate.cfg.xml中SessionFactory的name属性是否作为JNDI名称绑定.默认是true ...

  8. hibernate二级缓存ehcache hibernate配置详解

    <!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...

  9. Hibernate配置详解

    <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1.0' ...

随机推荐

  1. sql知识点的积累和使用过的例子

    越来越发现自己的sql方面的知识的欠缺,所以只能放低姿态一点一点的学了 一 游标和charIndex的使用. 游标我一直没用过,以前只是在同事们写的存储过程里见过,但是一直没看明白(可是我就是比较笨吧 ...

  2. 学点bootstrap

  3. HTML5 文件处理之FileAPI简介整理

    在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一.但文件处理,尤其是二进制文件处理,一直是个空白.在一些情况下,我们不得不通过Flas ...

  4. JS中escape 方法和C#中的对应

    在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...

  5. js正则实现用户输入银行卡号的控制及格式化

    //js正则实现用户输入银行卡号的控制及格式化 <script language="javascript" type="text/javascript"& ...

  6. Chess---->简单命令框象棋(人VS人)

    简单粗暴,直接先上代码: ChessBoard.h:  1 #ifndef CHESBOARD_H  2 #include<iostream>  3 #include<string& ...

  7. js实现滑动解锁功能(PC+Moblie)

    http://dummyimage.com/600x400/ http://placehold.it/140x70 实现效果: css样式代码略. html代码: 页面上导入了jquery.mobil ...

  8. 【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程

        (冒泡,选择,插入,希尔,快速,归并,堆排)周末加班学习C++,打算用C++写七大经典排序代码.发现3个月前自己写的七大经典排序代码(C Language)突然运行出错. Makefile内容 ...

  9. highcharts实例教程二:结合php与mysql生成饼图

    上回我们分析了用highcharts结合php和mysql生成折线图的实例,这次我们以技术cto网站搜索引擎流量为例利用highcharts生成饼图. 饼图通常用在我们需要直观地显示各个部分所占的比例 ...

  10. Git error- fatal- Needed a single revision

    最近在开发中由于项目结构的重构,有一部分代码被抽出来作为了公共库(git submodule),这样公共库可以独立维护,同时其他库调用它也是非常方便的,避免了到处复制代码的痛苦. 但我在项目重构后第一 ...