使用Hibernate和weblogic进行事务管理

时间:2014-12-07 15:47:44

标签: spring hibernate spring-transactions

我们的应用程序部署在weblogic

我们使用Hibernate和spring

会话工厂是通过用户定义的类创建的,该类通过读取hibernate.cfg.xml文件来创建SessionFactories

所以这些是步骤: 我们的自定义类在spring应用程序上下文中定义,我们在此类构造函数中注入CFG xml文件的格式:

<bean id="myCustomFactoryCreator"
    class="com.xyz.CustomFactoryCreator"
    singleton="true">
    <constructor-arg>
        <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" >
            <property name="staticField">
                <value>com.xyz.MyConstants.HIBERNATE_CFG_XML</value>
            </property>
        </bean>
    </constructor-arg>
</bean> 

在MyConstants.java中:

public static final String HIBERNATE_CFG_XML = ".hibernate.cfg.xml";

这样在构造函数中 - 代码将迭代所有以&#34; .hibernate.cfg.xml&#34;结尾的文件。 我将为不同的客户提供不同的文件: &#34; Client1.hibernate.cfg.xml&#34;和&#34; Client2.hibernate.cfg.xml&#34;等等......

代码将迭代所有这些文件并创建SessionFactories,然后将它们嵌入到Springs HibernateTemplate中,然后将它们作为键值对存储在映射中,作为键值对: 即Client1,HibernateTemplate1 Client2,HibernateTemplate2等 我希望你能得到这张照片

这个bean&#34; myCustomFactoryCreator&#34;然后注入我的Dao:

<bean id="myCustomDao"
    class="com.xyz.MyCustomDao"
    lazy-init="true">
    <property name="criteriaConverter" ref="criteriaConverter" />
    <property name="myFactory" ref="myCustomFactoryCreator" />
</bean>

我的Hibernate.cfg.xml示例如下:(我有多个此类文件,其中每个客户端的架构名称都发生了变化)

<hibernate-configuration>
<session-factory>
    <property name="connection.datasource">MYDS</property>
    <property name="show_sql">true</property>
    <property name="default_schema">CLIENT1SCHEMA</property>
</session-factory>

在我的Dao中 - 基于客户端登录 - 我得到了相应的HibernateTemplate并对数据库进行了选择 我们在这里使用&#34; DetachedCriteria&#34; - 示例代码如下:

List<T> inObjList=HibernateTemplate.findByCriteria(DetachedCriteria, 0, 100);

所以这一切都很好,这很好用 这是我们在4.x

之前使用Hibernate的时候

感谢你耐心等到现在 - 现在才能解决问题 使用Hibernate 4.x - 我不能再使用Springs Hibernate Template了 即使有办法使用它 - 由于我无法控制的原因,我将不被允许使用它 - 所以我必须去SessionFactory路线

所以遵循与上面相同的逻辑 - 我存储在地图clientName和SessionFactory中,而不是存储HibernateTemplate

不同之处在于现在我再也无法使用 - HibernateTemplate.findByCriteria() 所以我所做的是从地图中获取SessionFactory然后尝试获得会话:

Session session=testSessionFactory.getCurrentSession();

在上面的行中出现错误,但异常:

  

org.hibernate.HibernateException:没有配置CurrentSessionContext!

所以做了一些谷歌搜索并在stackoverflow中查看解决方案 - 我在我的CFG文件中添加了以下行 - 我不是100%确定它是否正确但是使用它假设我的是我正在使用的托管环境weblogic托管的数据源就是JTA:

<property name="hibernate.current_session_context_class">jta</property>

这让我得到了第一个例外 - 但后来我遇到了第二个例外:

  

org.hibernate.HibernateException:没有活动事务,createCriteria无效

在以下代码行中:

  

标准subSelectCriteria = session.createCriteria(getType());

我来自简陋的jdbc世界 - 所以我认为没什么大不了的 - 我只是在代码中添加一些事务ala jdbc - 所以我添加了这个:

Transaction tx = null;
session.beginTransaction();
Criteria subSelectCriteria =session.createCriteria(getType());
tx.commit();

上述提交失败并出现错误:

Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
at org.hibernate.engine.tx.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116)
at org.hibernate.engine.tx.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180)
Caused by: java.sql.SQLException: Cannot call Connection.commit in distributed transaction.  
Transaction Manager will commit the resource manager when the distributed tx is committed.
at weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:663)

然后在我的Hibernate CFG文件中,我添加了以下行,并在我的Dao中的Java代码中删除了事务管理:

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>

这给出了错误:

org.hibernate.HibernateException: No TransactionManagerLookup specified

所以请告诉我应该做些什么 - 并且感谢你在一篇长篇文章中与我合作

注意 - 我找到了一个解决方案,我可以在Spring中将每个SessionFactory定义为一个bean,并将每个SessionFactory注入一个

  

org.springframework.orm.hibernate4.HibernateTransactionManager

然而,这意味着每个SessionFactory我需要手动定义一个bean并注入HibernateTransactinManager

谢谢!

0 个答案:

没有答案
相关问题