PropertyPlaceholderConfigurer打破了我的hibernate会话

时间:2013-11-05 15:10:40

标签: java spring hibernate spring-mvc

我在Spring项目中遇到一个问题,在创建了我的hibernateSession和TransactionManager后,我启动了一个扩展 PropertyPlaceholderConfigurer 的bean 我不知道为什么但是在那一刻我的hibermnate会话毁掉了我的DAO的其余部分。抛出的错误就是这个。

Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

有什么建议吗?

我试图从数据库中提取一些数据来创建属性类并设置为我创建的扩展类 PropertyPlaceholderConfigurer

这是班级

 public class PropertiesSourceImpl extends PropertyPlaceholderConfigurer{

public ConfigurationSource configurationSource;

public Properties properties;

public void init() {
    for (ConfigurationProperty prop : configurationSource.getEnabledConfigurationPropertiesByType(ConfigurationProperty.PropertyType.MAIL)) {
        System.out.println(prop);
       // properties.setProperty(prop.getPropertyKey(), prop.getPropertyValue());
    }
}

public Properties getProperties() {
    return properties;
}

@Required
public void setConfigurationSource(final ConfigurationSource configurationSource) {
    this.configurationSource = configurationSource;
}

}

这里是我的bean定义

<bean id="propertiesSource" class="nl.greenvalley.digipolis.config.PropertiesSourceImpl" init-method="init">
    <property name="configurationSource" ref="configurationSource"/>
</bean>

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案。而不是使用hibernate我只是在创建hibernate会话和事务之前创建一个新的会话和事务。

      SessionFactory sessionFactory;

public void init() {
    Session session = sessionFactory.openSession();
    Transaction tx = null;
    try {
        Properties properties = new Properties();
        tx = session.beginTransaction();
        List<ConfigurationProperty> dbProperties = session.createCriteria(ConfigurationProperty.class).list();
        for (ConfigurationProperty property : dbProperties) {
            properties.setProperty(property.getPropertyKey(), property.getPropertyValue());
        }
        setProperties(properties);
        tx.commit();
    } finally {
        session.close();
    }
}