2016-06-11 6 views
0

프로젝트에 Hibernate Search를 추가하고 싶습니다. 이것을 테스트하기 위해 이와 같은 샘플 코드를 작성합니다.EntityManager를 사용하여 Hibernate Search 구성하기

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; 
    } 
} 

나는 pu 이름 entityManagerFactory()에 퍼시스턴스 유닛을 생성, 그래서 내가 왜 예외를 받고 있어요? 이 저장소 구성은 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

질문에 최대 절전 모드 의존성을 추가했습니다. –

답변

2

당신은 봄의 LocalContainerEntityManagerFactoryBean를 통해 퍼시스턴스 유닛을 설정하지만 그것을 얻기 위해 일반 JPA (Persistence)를 사용하고 있습니다.

스프링을 사용하여 종속성 삽입을 통해 엔티티 관리자 (출고시)를 얻어야하거나 persistence.xml을 설정하여 일반 JPA를 통해 얻을 수 있습니다.

+0

맞습니다. 내 실수는 무지의 결과였습니다. 새로운 퍼시스턴스 유닛을 생성하는 대신'@PersistenceContext EnitityManager em;'을 사용했습니다. JPA/Hibernate를 사용하는 데 몇 달이 지난 후에도 저는 여전히 자신감이 없습니다. –

관련 문제