jboss5下面ejb3使用hibernate3.3 session
程序员文章站
2022-03-25 20:52:31
...
使用ejb3的时候,一般使用JPA,也就是用entityManager作为连接来操作持久化的业务,如果用hibernate的session来操作持久化业务,将是怎样呢?
查了一些资料,也走了一点弯路,现在把细节公布出来,希望能帮助类似项目的开发者节省一些时间,简而言之,hibernate文档中关于 把SessionFactory注册到JNDI中的方法在jboss5环境下面有问题,jboss5针对这个场景有新的办法:
原来的(struts2.1 spring2.5 hibernate3.3)架构转为 struts2+spring2.5 + jboss5( ejb3+hibernate3 )
为了继续能使用hibernate的会话以及一大堆BO DAO的代码,希望不使用entityManager,继续使用hibernate session,
那么为了得到sessionFactory,看了hibernate的文档,原来的mbean的方式是针对以前版本jboss4的写法,在jboss5下面报错。
<mbean code="org.hibernate.jmx.HibernateService"
name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
<!-- 必须的服务 -->
<depends>jboss.jca:service=RARDeployer</depends>
<depends>jboss.jca:service=LocalTxCM,name=HsqlDS</depends>
<!-- 将Hibernate服务绑定到JNDI -->
<attribute name="JndiName">java:/hibernate/SessionFactory</attribute>
<!-- 数据源设置 -->
<attribute name="Datasource">java:HsqlDS</attribute>
<attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute>
<!-- 事务集成 -->
<attribute name="TransactionStrategy">
org.hibernate.transaction.JTATransactionFactory</attribute>
<attribute name="TransactionManagerLookupStrategy">
org.hibernate.transaction.JBossTransactionManagerLookup</attribute>
<attribute name="FlushBeforeCompletionEnabled">true</attribute>
<attribute name="AutoCloseSessionEnabled">true</attribute>
<!-- 抓取选项 -->
<attribute name="MaximumFetchDepth">5</attribute>
<!-- 二级缓存 -->
<attribute name="SecondLevelCacheEnabled">true</attribute>
<attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
<attribute name="QueryCacheEnabled">true</attribute>
<!-- 日志 -->
<attribute name="ShowSqlEnabled">true</attribute>
<!-- 映射定义文件 -->
<attribute name="MapResources">auction/Item.hbm.xml,auction/Category.hbm.xml</attribute>
</mbean>
现在jboss5下面,使用的是如下的方法:
在deploy目录下面,新建一个以 -hibernate.xml结尾的xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration xmlns="urn:jboss:hibernate-deployer:1.0">
<session-factory name="java:/hib-timers/SessionFactory" bean="jboss.test.har:service=Hibernate,testcase=TimersUnitTestCase">
<property name="datasourceName">java:/PostgresDS</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!--
<property name="sessionFactoryInterceptor">org.jboss.test.hibernate.SimpleInterceptor</property>
-->
<property name="hbm2ddlAuto">update</property>
<depends>jboss:service=Naming</depends>
<depends>jboss:service=TransactionManager</depends>
</session-factory>
</hibernate-configuration>
这样的话即可。启动jboss5出现 如下log:
18:30:47,906 INFO [Hibernate] SessionFactory successfully built and bound into JNDI [java:/hib-timers/SessionFactory]
那么算是成功的创建了sessionFactory
检查一下上面的log,发现SimpleInterceptor有noFoundException,但是sessionFactory还是创建成功
再检查检查...
学习参考来源:http://community.jboss.org/wiki/JBossHibernate3
查了一些资料,也走了一点弯路,现在把细节公布出来,希望能帮助类似项目的开发者节省一些时间,简而言之,hibernate文档中关于 把SessionFactory注册到JNDI中的方法在jboss5环境下面有问题,jboss5针对这个场景有新的办法:
原来的(struts2.1 spring2.5 hibernate3.3)架构转为 struts2+spring2.5 + jboss5( ejb3+hibernate3 )
为了继续能使用hibernate的会话以及一大堆BO DAO的代码,希望不使用entityManager,继续使用hibernate session,
那么为了得到sessionFactory,看了hibernate的文档,原来的mbean的方式是针对以前版本jboss4的写法,在jboss5下面报错。
<mbean code="org.hibernate.jmx.HibernateService"
name="jboss.jca:service=HibernateFactory,name=HibernateFactory">
<!-- 必须的服务 -->
<depends>jboss.jca:service=RARDeployer</depends>
<depends>jboss.jca:service=LocalTxCM,name=HsqlDS</depends>
<!-- 将Hibernate服务绑定到JNDI -->
<attribute name="JndiName">java:/hibernate/SessionFactory</attribute>
<!-- 数据源设置 -->
<attribute name="Datasource">java:HsqlDS</attribute>
<attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute>
<!-- 事务集成 -->
<attribute name="TransactionStrategy">
org.hibernate.transaction.JTATransactionFactory</attribute>
<attribute name="TransactionManagerLookupStrategy">
org.hibernate.transaction.JBossTransactionManagerLookup</attribute>
<attribute name="FlushBeforeCompletionEnabled">true</attribute>
<attribute name="AutoCloseSessionEnabled">true</attribute>
<!-- 抓取选项 -->
<attribute name="MaximumFetchDepth">5</attribute>
<!-- 二级缓存 -->
<attribute name="SecondLevelCacheEnabled">true</attribute>
<attribute name="CacheProviderClass">org.hibernate.cache.EhCacheProvider</attribute>
<attribute name="QueryCacheEnabled">true</attribute>
<!-- 日志 -->
<attribute name="ShowSqlEnabled">true</attribute>
<!-- 映射定义文件 -->
<attribute name="MapResources">auction/Item.hbm.xml,auction/Category.hbm.xml</attribute>
</mbean>
现在jboss5下面,使用的是如下的方法:
在deploy目录下面,新建一个以 -hibernate.xml结尾的xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<hibernate-configuration xmlns="urn:jboss:hibernate-deployer:1.0">
<session-factory name="java:/hib-timers/SessionFactory" bean="jboss.test.har:service=Hibernate,testcase=TimersUnitTestCase">
<property name="datasourceName">java:/PostgresDS</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!--
<property name="sessionFactoryInterceptor">org.jboss.test.hibernate.SimpleInterceptor</property>
-->
<property name="hbm2ddlAuto">update</property>
<depends>jboss:service=Naming</depends>
<depends>jboss:service=TransactionManager</depends>
</session-factory>
</hibernate-configuration>
这样的话即可。启动jboss5出现 如下log:
18:30:47,906 INFO [Hibernate] SessionFactory successfully built and bound into JNDI [java:/hib-timers/SessionFactory]
那么算是成功的创建了sessionFactory
检查一下上面的log,发现SimpleInterceptor有noFoundException,但是sessionFactory还是创建成功
再检查检查...
学习参考来源:http://community.jboss.org/wiki/JBossHibernate3