Spring + Hibernate: LocalSessionFactoryBean - NoSuchMethodError: org.hibernate.cfg.annotations.reflection.XMLContext - PullRequest
6 голосов
/ 26 декабря 2011

Я пытаюсь интегрировать Hibernate 4.0.0.FINAL с Spring 3.1.0.RELEASE используя @Configuration.

После этого возникает проблема:

BeanCreationException: Error creating bean with name 'alertsSessionFactoryBean'
NoSuchMethodError: org.hibernate.cfg.annotations.reflection.XMLContext$Default.getDelimitedIdentifier()Ljava/lang/Boolean;

Это мой PersistenceHibernateConfig файл

@Configuration
@EnableTransactionManagement
public class PersistenceHibernateConfig {

    @Value("${jdbc.driverClassName}")
    private String driverClassName;

    @Value("${jdbc.url}")
    private String url;

    @Value("${hibernate.dialect}")
    String hibernateDialect;

    @Value("${hibernate.show_sql}")
    boolean hibernateShowSql;

    @Value("${hibernate.hbm2ddl.auto}")
    String hibernateHbm2ddlAuto;

    @Bean
    public LocalSessionFactoryBean alertsSessionFactoryBean() {
        final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(this.restDataSource());
        sessionFactory.setPackagesToScan(new String[]{"com.cloudlb"});
        sessionFactory.setHibernateProperties(this.hibernateProperties());

        return sessionFactory;
    }

    @Bean
    public DataSource restDataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(this.driverClassName);
        dataSource.setUrl(this.url);
        dataSource.setUsername("test");
        dataSource.setPassword("1234");

        return dataSource;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        final HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(this.alertsSessionFactoryBean().getObject());

        return txManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslationPostProcessor() {
        return new PersistenceExceptionTranslationPostProcessor();
    }

    @Bean
    public PersistenceExceptionTranslator exceptionTranslator() {
        return new HibernateExceptionTranslator();
    }

    final Properties hibernateProperties() {
        return new Properties() {
            {
                this.put("persistence.dialect", PersistenceHibernateConfig.this.hibernateDialect);
                this.put("hibernate.hbm2ddl.auto", PersistenceHibernateConfig.this.hibernateHbm2ddlAuto);
                this.put("hibernate.show_sql", PersistenceHibernateConfig.this.hibernateShowSql);
            }
        };
    }
}

Я думаю, что это может быть проблема с LocalSessionFactoryBean, но я не могу понять, что не так. Я могу что-то упустить.

Я обнаружил, что это из-за отсутствия hibernate-annotation.jar, если это 3.x Не знаю, почему в 4.0 аннотация: org.hibernate.cfg.annotations.reflection.XMLContext находится в jar-файле hibernate-core, и это все еще ошибка.

Заранее спасибо

1 Ответ

7 голосов
/ 26 декабря 2011

OK. Похоже, у вас проблемы с предоставлением совместимых версий всех необходимых зависимостей. Вот несколько мыслей о том, что может быть не так:

  1. Не похоже, что вы используете Maven или что-то подобное для управления своими зависимостями. Настоятельно рекомендуется использовать автоматический инструмент для управления вашими зависимостями, поскольку очень сложно / подвержено ошибкам предоставлять все необходимые зависимости вручную. Тем не менее, вы должны иметь возможность скачать релиз в виде zip-файла, содержащего все необходимые файлы jar из здесь . Это то, что вы сделали?

  2. Ядро Hibernate зависит от hibernate-commons-annotations.jar. Все аннотации, которые были в спящих аннотациях, были в основном фляге некоторое время. Поэтому вам нужен hibernate-commons-annotations.jar, а не hibernate-annotations.jar

...