2016-06-11 7 views
0

Я хочу добавить Hibernate Search в свой проект, я пишу пример кода, чтобы проверить его.Настройка поиска в спящем режиме с EntityManager

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("pu"); 
EntityManager em = entityManagerFactory.createEntityManager(); 

FullTextEntityManager fullTextSession = Search.getFullTextEntityManager(em); 
em.getTransaction().begin(); 

QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Place.class).get(); 

double centerLatitude = 0d; 
double centerLongitude = 0d; 
org.apache.lucene.search.Query luceneQuery = builder 
       .spatial() 
       .within(100, Unit.KM) 
       .ofLatitude(centerLatitude) 
       .andLongitude(centerLongitude) 
       .createQuery(); 

javax.persistence.Query jpaQuery = 
       fullTextSession.createFullTextQuery(luceneQuery, Place.class); 

    List result = jpaQuery.getResultList(); 

em.getTransaction().commit(); 
em.close(); 

И я получаю исключение, как это.

javax.persistence.PersistenceException: No Persistence provider for EntityManager named pu 
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61) 
    javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 
    pl.project.repository.place.CustomPlaceRepositoryImpl.findAll(CustomPlaceRepositoryImpl.java:24) 
    pl.project.service.place.PlaceServiceImpl.findNearest(PlaceServiceImpl.java:157) 
    pl.project.webapp.HomeController.helloFacebook(HomeController.java:41) 

Вот моя конфигурация репозитория.

@Configuration 
@EnableTransactionManagement 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
@PropertySource("classpath:jdbc.properties") 
@EnableJpaRepositories(value = "pl.project") 
@ComponentScan(basePackages = "pl.project.repository", includeFilters =  @ComponentScan.Filter(value = Repository.class, type = FilterType.ANNOTATION)) 
public class RepositoryConfig { 

    //... 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setPersistenceUnitName("pu"); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPackagesToScan("pl.project.model"); 
     entityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter()); 
     entityManagerFactoryBean.setJpaProperties(jpaProperties()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     return entityManagerFactoryBean; 
    } 

    @Bean 
    public Properties jpaProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", hbm); 
     properties.setProperty("hibernate.enable_lazy_load_no_trans", "true"); 
     return properties; 
    } 

    @Bean 
    public HibernateJpaVendorAdapter jpaVendorAdapter() { 
     HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();   hibernateJpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.MySQLDialect"); 
     return hibernateJpaVendorAdapter; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 
     return transactionManager; 
    } 

    @Bean 
    public DriverManagerDataSource dataSource() { 
     //... driver, pass, username 
     return dataSource; 
    } 
} 

Я создал единицы сохранения в entityManagerFactory() имени pu, так почему я получаю исключение? Эта конфигурация репозитория работала до того, как я добавил поиск Hibernate.

Нужна дополнительная информация persistence.xml? Есть способ настроить его с помощью JavaConfig?

Мои dependecies

<!-- Hibernate --> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.0.1.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.0.1.Final</version> 
    </dependency> 


    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-search-orm</artifactId> 
     <version>5.5.3.Final</version> 
    </dependency> 
+0

Вы проверили, что ваш путь к классу не имеет нескольких версий спящего режима? Какие версии Hiberate Search & Core вы используете? – Naros

+0

Я добавил свои зависимости от спящего режима в поле post –

ответ

2

Вы создали единицы сохранения с помощью Spring, LocalContainerEntityManagerFactoryBean, но затем с помощью простой JPA (Persistence) для того, чтобы получить его.

Таким образом, вам нужно либо получить менеджер объектов (заводской) через инъекцию зависимостей с использованием Spring, либо настроить persistence.xml, чтобы вы могли получить его через простой JPA.

+0

Вы правы, моя ошибка была результатом невежества. Я использовал '@PersistenceContext EnitityManager em;' вместо того, чтобы пытаться создать новый блок персистентности. После нескольких месяцев использования JPA/Hibernate я все еще чувствую себя неуверенным. –