2015-02-10 2 views
0

Я работаю над одним усовершенствованием в своем приложении. Это приложение - Spring Hibernate. Но теперь я улучшаю Spring-JPA. Не нарушая существующую реализацию, мне нужно включить JPA Ниже приведен мой класс конфигурации DB.Как добавить Spring JPA в существующее приложение Spring Hibernate

@Configuration 
@EnableJpaRepositories(basePackages = {"packagename","package name" }) 
@EnableTransactionManagement 
public class DataBaseConfiguration { 

    @Value("${postgres.driver}") 
    private String postgresDriver; 
    @Value("${postgres.url}") 
    private String postgresUrl; 
    @Value("${postgres.username}") 
    private String postgresUsername; 
    @Value("${postgres.password}") 
    private String postgresPassword; 

    @Value("${hibernate.dialect}") 
    private String hibernateDialect; 
    @Value("${hibernate.dialect.property}") 
    private String dialectProperty; 
    @Value("${hibernate.show-sql}") 
    private String hibernateShowSql; 
    @Value("${boolean.true}") 
    private String booleanTrue; 

    **\\ existing hibernate flow** 
    @Autowired 
    @Bean(name = "name") 
    public SessionFactory getSessionFactory(DataSource dataSource) { 

     LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(
       dataSource); 

     sessionBuilder.addAnnotatedClasses(entity.class); 
     sessionBuilder.setProperty(hibernateDialect, dialectProperty); 
     sessionBuilder.setProperty(postgresDriver, postgresUrl); 
     sessionBuilder.setProperty(hibernateShowSql, booleanTrue); 

     return sessionBuilder.buildSessionFactory(); 
    } 

     **\\ existing hibernate flow** 
    @Bean(name = "name") 
    public DataSource getDataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(postgresDriver); 
     dataSource.setUrl(postgresUrl); 
     dataSource.setUsername(postgresUsername); 
     dataSource.setPassword(postgresPassword); 
     return dataSource; 
    } 

    **\\ existing hibernate flow** 
    @Autowired 
    @Bean(name = "manager") 
    public HibernateTransactionManager getTransactionManager(
      SessionFactory sessionFactory) { 
     HibernateTransactionManager transactionManager = null; 
     transactionManager = new HibernateTransactionManager(sessionFactory); 
     return transactionManager; 
    } 
    **\\included newly for JPA** 
    @Bean 
    public org.springframework.orm.jpa.JpaTransactionManager transactionManager() { 
     JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
     jpaTransactionManager.setDataSource(getDataSource()); 
     jpaTransactionManager 
       .setJpaDialect(new org.springframework.orm.jpa.vendor.HibernateJpaDialect()); 
     return jpaTransactionManager; 
    } 
     **\\included newly for JPA** 
    @Bean 
    public EntityManager entityManger() { 
     return entityManagerFactory().getObject().createEntityManager(); 
    } 
     \\included newly for JPA 
    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactory.setDataSource(getDataSource()); 

     entityManagerFactory.setPackagesToScan(
       "some package", 
       "some package"); 
     Map<String, Object> jpaProperty = entityManagerFactory 
       .getJpaPropertyMap(); 
     jpaProperty.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 

     HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter(); 
     va.setShowSql(Boolean.valueOf("true")); 
     entityManagerFactory.setJpaVendorAdapter(va); 
     return entityManagerFactory; 
    } 
} 

Когда я разворачивал это приложение, я получаю ниже исключения

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class ------ 
Caused by: java.lang.NullPointerException 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4285) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:980) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3609) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:3387) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:3259) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2964) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:597) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2730) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2591) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2555) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:2471) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:2436) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.expression(HqlBaseParser.java:2146) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.exprList(HqlBaseParser.java:3994) 
    at org.hibernate.hql.internal.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:4278) 
+0

Как вы создаете свой компонент 'DataBaseConfiguration'? – Reimeus

+0

В моей конфигурации сервлета в конфигурационном классе Mvc я сохраняю защищенный класс [] getServletConfigClasses() {retung databaseconfiguration.class} – Ramkumar

+0

Я предполагаю, что у вас есть синтаксическая ошибка в некоторых запросах, которые могут быть в порядке как HQL, но не как JPAQL, см., Например, http://what-when-how.com/hibernate/querying-with-hql-and-jpa-ql-hibernate/ Кстати, где-то в вашей stacktrace может появиться сообщение об ошибке, в котором указывается, какой из запросов не подходит. Вы также можете попробовать удалить все запросы (и/или один за другим), чтобы увидеть, действительно ли это проблема. – Michal

ответ

1

Я хотел бы предложить другой подход, который может быть проще. Сделайте JPA лидером и используйте LocalContainerEntityManagerFactoryBean для настройки всего (включая то, что вы используете сейчас для спящего режима). Затем используйте HibernateJpaSessionFactoryBean, чтобы открыть базовый номер SessionFactory.

Это сохранить бы вы продублировать конфигурацию и позволит вам использовать один JpaTransactionManager для всех сделок, однако вы по-прежнему будет иметь возможность использовать SessionFactory или HibernateTemplate, если бы вы.

@Configuration 
@EnableJpaRepositories(basePackages = {"packagename","package name" }) 
@EnableTransactionManagement 
public class DataBaseConfiguration { 

    @Autowired 
    private Environment env; 

    @Autowired 
    @Bean(name = "name") 
    public FactoryBean<SessionFactory> getSessionFactory(EntityManagerFactory emf) { 
     HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean(); 
     factory.setEntityManagerFactory(emf); 
     return factory; 
    } 

     **\\ existing hibernate flow** 
    @Bean(name = "name") 
    public DataSource getDataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getRequiredProperty("postgres.driver")); 
     dataSource.setUrl(env.getRequiredProperty("postgres.url); 
     dataSource.setUsername(env.getRequiredProperty("postgres.username"); 
     dataSource.setPassword(env.getRequiredProperty("postgres.password"); 
     return dataSource; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(); 
     jpaTransactionManager.setDataSource(getDataSource()); 
     jpaTransactionManager.setEntityManagerFactory(entityManagerFactory()); 
     return jpaTransactionManager; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactory.setDataSource(getDataSource()); 
     Map<String, String> properties = new HashMap<String, String>(); 
     properties.put("hibernate.current_session_context_class", SpringSessionContext.class.getName()); 

     entitytManagerFactory.setJpaPropertyMap(properties); 
     entityManagerFactory.setPackagesToScan(
       "some package", 
       "some package"); 

     HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter(); 
     va.setShowSql(env.getProperty("hibernate.show-sql", Boolean.class, true); 
     va.setDatabasePlatform(env.getProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     entityManagerFactory.setJpaVendorAdapter(va); 
     return entityManagerFactory; 
    } 
} 
Смежные вопросы