Spring Data 1.7.0.RELEASE查询策略错误"基础设施显然不支持查询方法"

时间:2014-09-19 00:04:51

标签: mysql hibernate spring-boot spring-data-jpa

我在使用存储库的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>    

1 个答案:

答案 0 :(得分:1)

您需要包含spring-data-commons更高版本,例如1.9.1.RELEASE