在上下文之外加载Hibernate属性并不起作用

时间:2014-05-16 14:26:59

标签: java spring hibernate

我在这里遇到一些奇怪的问题,现在我被卡住了。我已经在这方面阅读了其他一些帖子,其中一些帖子帮助我配置了我的环境,但出于某种原因,我无法找出它无法正常工作的原因。

我需要将hibernate.connection.url, hibernate.connection.username and hibernate.connection.password属性放在WAR文件之外,以便在系统部署在不同服务器上时更容易配置theese参数。因此,在挖掘Google之后,我找到了这个解决方案:

的applicationContext.xml:

...
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory" class="br.myapp.DataBaseConfig"/>

班级DataBaseConfig

public class DataBaseConfig extends AnnotationSessionFactoryBean {
    private final BaseConfig baseConfig = new BaseConfig();  

    public DataBaseConfig() {
        super();
    }

    @Override
    protected SessionFactory buildSessionFactory() throws Exception {
        Properties dbConfig = new Properties();
        dbConfig = baseConfig.getPropertiesFile("myPropertiesFile");

        Configuration config = new Configuration();
        Enumeration<Object> props = dbConfig.keys();

        while ( props.hasMoreElements() ){
            String key = (String)props.nextElement();
            config.setProperty( key , dbConfig.getProperty(key) ); 
        }
        config.addResource("hibernate.cfg.xml");

        SessionFactory sessionFactory = config.buildSessionFactory(); 
        return sessionFactory;
    }
}

我的hibernate.cfg.xml文件如下:

<hibernate-configuration>
    <session-factory>
        <mapping class="br.myapp.model.SomeClass1" />
        <mapping class="br.myapp.model.SomeClass2" />
        <mapping class="br.myapp.model.SomeClass3" />
    </session-factory>
</hibernate-configuration>

我的myPropertiesFile是:

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.url=jdbc:oracle:thin:@localhost:1524:MyDB
hibernate.connection.username=user
hibernate.connection.password=passpass
hibernate.default_schema=myschema
hibernate.connection.oracle.jdbc.V8Compatible=true
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
#I'm usign c3p0 to pool connections
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=300
hibernate.c3p0.max_statements=50
hibernate.c3p0.idle_test_period=3000
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.EhCacheRegionFactory

当我试图通过这种方式从数据库中获取某些东西时没有成功的环境:

final SomeClass1 sm = repository.find(SomeClass1.class)
            .where( Restrictions.eq( "someField" , varFromWebForm ) )
            .uniqueResult();

sm始终返回null,并且即使设置了hibernate.show_sql=true,也无法在控制台上打印查询。

奇怪的是,当我更改applicationContext.xml文件中的配置时,就像这样

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation">
        <value>classpath:/hibernate.cfg.xml</value>
    </property>
</bean>

hibernate.cfg.xml文件到此

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1524:MyDB</property>
        <property name="hibernate.connection.username">user</property>
        <property name="hibernate.connection.password">passpass</property>
        <property name="hibernate.default_schema">myschema</property>
        <property name="hibernate.connection.oracle.jdbc.V8Compatible">true</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
        <mapping class="br.myapp.model.SomeClass1" />
        <mapping class="br.myapp.model.SomeClass2" />
        <mapping class="br.myapp.model.SomeClass3" />
    </session-factory>
</hibernate-configuration>

一切正常。因此,就像读取属性并将其注入Configuration to Hibernate(DataBaseConfig)的代码无法正常工作。 有人能指出我做错了什么吗?

更新:

控制台上没有例外。它只是不起作用。

更新2

这是来自apache服务器的日志。我使用VRaptor作为controllerManager,并且当我调用我的方法进行查询时出现的唯一事情是对控制器的请求没有别的,因此我认为把它放在这里并不重要。

我尝试将日志放在这里,但是SO并不允许我,因为它推断了问题的字符限制,所以这里是一个指向pastebin的链接:http://pastebin.com/cASD7EPu

感谢。

2 个答案:

答案 0 :(得分:0)

当您说(DataBaseConfig)工作不正常时:您是否有Spring容器返回的ExceptionsStackTrace。尝试以调试/跟踪模式启动应用程序以查看确切的结果。

答案 1 :(得分:0)

我通过改变阅读配置的方式设法解决了我自己的问题。我正在做的waqy不起作用,我无法找出原因。这是这样的:

@Override
protected SessionFactory buildSessionFactory() throws Exception {
    Properties dbConfig = new Properties();
    dbConfig = baseConfig.getPropertiesFile("myPropertiesFile");

    Configuration config = new Configuration();
    Enumeration<Object> props = dbConfig.keys();

    while ( props.hasMoreElements() ){
        String key = (String)props.nextElement();
        config.setProperty( key , dbConfig.getProperty(key) ); 
    }
    config.addResource("hibernate.cfg.xml");

    SessionFactory sessionFactory = config.buildSessionFactory(); 
    return sessionFactory;
}

所以我正在阅读Hibernate#Configuration docs并找到方法configure(File file)。然后我从我的上下文中取出hibernate.cfg.xml并将其放在我的configs目录(我从我的项目的Util类中获取)并且它工作正常。最后的方法如下:

@Override
protected SessionFactory buildSessionFactory() throws Exception {
    Configuration config = new Configuration();
    config.configure(
             new File( BaseConfig.CONFIG_BASE 
                        + File.separator 
                        + "hibernate.cfg.xml" ) 
    );
    SessionFactory sessionFactory = config.buildSessionFactory(); 
    return sessionFactory;
}

现在它工作正常。我想找出为什么以前的配置无法理解。这不是最好的解决方案,但解决了我的问题。

我在这里的朋友总是说:&#34;在别人展示更好的解决方案之前,这不是一个丑陋的解决方案!&#34;。所以现在我会坚持这个。

感谢那些来到这里并试图帮助我的人。

我不会在一段时间内将这个答案标记为正确的答案,看看其他人是否可以向我展示更好的解决方案:)