使用EntityManager配置Hibernate搜索
我想将Hibernate搜索添加到我的项目中,我编写这样的示例代码来测试它使用EntityManager配置Hibernate搜索,hibernate,jpa,spring-data,entitymanager,hibernate-search,Hibernate,Jpa,Spring Data,Entitymanager,Hibernate Search,我想将Hibernate搜索添加到我的项目中,我编写这样的示例代码来测试它 EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("pu"); EntityManager em = entityManagerFactory.createEntityManager(); FullTextEntityManager fullTextSession = Search.getFullT
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来配置它
我的依赖
<!-- 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>
org.hibernate
冬眠核心
5.0.1.最终版本
org.hibernate
休眠实体管理器
5.0.1.最终版本
org.hibernate
休眠搜索orm
5.5.3.最终版本
您通过Spring的LocalContainerEntityManagerFactoryBean设置了持久性单元,但随后使用普通JPA(持久性
)来获得它
因此,您需要使用Spring通过依赖项注入获得实体管理器(工厂),或者设置persistence.xml以便通过普通JPA获得它。您通过Spring的LocalContainerEntityManagerFactoryBean设置了持久化单元,但随后使用普通JPA(持久化)为了得到它
因此,您要么需要使用Spring通过依赖项注入获得实体管理器(工厂),要么设置persistence.xml以便通过普通JPA获得它。您是否验证了您的类路径没有多个版本的hibernate?您使用的Hiberate Search&Core版本是什么?我添加了有问题的hibernate依赖项。您是否验证了您的类路径没有多个hibernate版本?你在使用什么版本的Hiberate Search&Core?我在问题中添加了我的hibernate依赖项。你是对的,我的错误是无知造成的。我使用了@PersistenceContext-EnitityManager-em代码>而不是尝试创建新的持久性单元。在使用JPA/Hibernate几个月后,我仍然觉得没有自信。你是对的,我的错误是无知造成的。我使用了@PersistenceContext-EnitityManager-em代码>而不是尝试创建新的持久性单元。在使用JPA/Hibernate几个月后,我仍然感到不自信。