Hibernate查询未返回更新结果

时间:2013-06-17 13:38:15

标签: java hibernate

在我的项目中,我有两部分UI和Engine。两者都访问相同的数据库但不同的hbm.xml文件和hibernate连接。如果我尝试从UI更新某些表值,则引擎端查询不会返回更新的值。

这是一般问题吗?以下是我的代码。我在网上查了一下,发现了一些关于Hibernate Cache的东西。我不知道如何删除它。请帮忙。

public CgUssdGatewayConf getGwConfig(Long gwId)
{
    logger.info("GW ID : "+gwId);
    Criteria criteria = getSession().createCriteria(CgUssdGatewayConf.class);
    criteria.add(Restrictions.eq("gwId", gwId));
    //Now checking while cache loading time.
    //criteria.add(Restrictions.eq("status", Constants.GW_STATUS_ENABLE));

    List<CgUssdGatewayConf> list = (List<CgUssdGatewayConf>) criteria.list();
    if(list != null && !list.isEmpty())
    {
        CgUssdGatewayConf cgUssdGatewayConf = list.get(0);
        logger.info("GW ID : "+cgUssdGatewayConf.getGwId()+ " :: Name : "+cgUssdGatewayConf.getGwName() + " :: Status : "+cgUssdGatewayConf.getStatus());
        return cgUssdGatewayConf;
    }
    return null;
}

我的hibernate配置是 -

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <!-- Mysql Config -->
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/consentgateway</prop>
            <prop key="hibernate.connection.username">cg</prop>
            <prop key="hibernate.connection.password">cg123</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

            <prop key="hibernate.connection.autoReconnect">true</prop>
            <prop key="hibernate.connection.autoReconnectForPools">true</prop>
            <prop key="hibernate.connection.is-connection-validation-required">true</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
            <prop key="hibernate.c3p0.min_size">4</prop>
            <prop key="hibernate.c3p0.max_size">50</prop>
            <prop key="hibernate.c3p0.timeout">0</prop>
            <prop key="hibernate.c3p0.max_statements">0</prop>
            <prop key="hibernate.c3p0.idle_test_period">10800</prop>
            <prop key="hibernate.c3p0.acquire_increment">3</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
            <prop key="hibernate.c3p0.maxAdministrativeTaskTime">0</prop>
            <prop key="hibernate.c3p0.acquireRetryAttempts">5</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.characterEncoding">UTF-8</prop>
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>CgUssdGatewayConf.hbm.xml</value>
        </list>
    </property>
</bean>

2 个答案:

答案 0 :(得分:1)

第一级缓存是Hibernate中的默认设置,并始终与Session对象关联。 Hibernate默认使用此缓存。在这里,它处理一个接一个的事务。主要是它减少了在给定事务中生成所需的SQL查询的数量。这不是在事务中完成的每个修改之后更新,而是仅在事务结束时更新事务。

用于反映缓存查询的效果Hibernate Transaction需要提交。

我不知道你是否已经承诺但是要检查它。

Transaction trnsction = session.beginTransaction();

update queries

transaction.commit();

答案 1 :(得分:0)

根本无法禁用第一级缓存。 但是,在加载对象之前,您可以evict Session.evict(entity); 对象。结果,将从数据库重新读取对象。

refresh

Session.refresh(entity); 对象。还从数据库加载最新的对象状态,并重写会话中的现有对象状态。

{{1}}