我在使用存储库的mysql的Spring Boot + jpa Hibernate中收到以下错误:
创建名为'accountRepository'的bean:init方法的调用失败;嵌套异常是java.lang.IllegalStateException:您已在存储库中定义了查询方法,但未定义任何查询查找策略。基础设施显然不支持查询方法!
这适用于旧版本的Spring数据+ jpa,只有一个spring mvc应用程序而不是Spring Boot应用程序。
我能找到的唯一解决方案是有人降级到spring-data 1.6.2.RELEASE(Spring Data JPA Error for 1.7.0.M1 query lookup strategy Exception),我试过但是它引起了其他冲突可能是因为我使用了最近的一个Spring Boot Spring核心很可能与旧版本的spring-data有依赖性冲突。
我也意识到指定默认的queryLookupStrategy是没有必要的。
通过Java Config的jpa配置是
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.ranchtec.repository", queryLookupStrategy = QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
@PropertySource({ "classpath:db.properties" })
public class PersistenceJPAConfig {
@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jpa.generateDdl}")
boolean jpaGenerateDdl;
// Hibernate specific
@Value("${hibernate.dialect}")
String hibernateDialect;
@Value("${hibernate.show_sql}")
boolean hibernateShowSql;
@Value("${hibernate.hbm2ddl.auto}")
String hibernateHbm2ddlAuto;
@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;
public PersistenceJPAConfig() {
}
@Autowired
org.springframework.core.env.Environment env;
// beans
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(appDataSource());
factoryBean.setPackagesToScan(new String[] { "com.ranchtec.domain" });
final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter() {
{
setDatabasePlatform(hibernateDialect);
setShowSql(hibernateShowSql);
setGenerateDdl(jpaGenerateDdl);
setDatabase(Database.MYSQL);
}
};
factoryBean.setJpaVendorAdapter(vendorAdapter);
factoryBean.setJpaProperties(additionlProperties());
return factoryBean;
}
@Bean
public DataSource appDataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(jdbcUsername);
dataSource.setPassword(jdbcPassword);
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
final Properties additionlProperties() {
return new Properties() {
{
// use this to inject additional properties in the EntityManager
// setProperty("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
setProperty("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());
}
};
}
存储库是通用的:
public interface AccountRepository extends CrudRepository<Account, Long> {
Account findById(Long id);
Account findByUserName(String userName);
List<Account> findAll();
}
关键代表:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
<!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.6.Final</version>
</dependency>
答案 0 :(得分:1)
您需要包含spring-data-commons
更高版本,例如1.9.1.RELEASE