2015-09-02 27 views
13

我與spring data工作,我創建的配置類@Bean@EntityMain.java但跑項目時,我得到異常:不是託管類型:類實體。與春數據

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'todoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class entity.Todo

Main.java

public class Main { 

    @Autowired 
    private static TodoRepository todoRepository; 

    public static void main(String[] args) { 
     Todo todo = new Todo(); 
     todo.setId(1l); 
     todo.setTitle("title"); 
     System.out.println(todoRepository); //null 
     todoRepository.save(todo);   //Exception in thread "main" java.lang.NullPointerException 
    } 
} 

PersistenceContext.java

@Configuration 
@EnableJpaRepositories(basePackages = {"repository"}, 
     entityManagerFactoryRef = "entityManagerFactory", 
     transactionManagerRef = "transactionManager") 
@EnableTransactionManagement 
@PropertySource("classpath:app.properties") 
public class PersistenceContext { 

    public PersistenceContext() { 
    } 

    /** 
    * The method that configures the datasource bean 
    * */ 

    @Resource 
    private Environment env; 

    @Bean(destroyMethod = "close") 
    DataSource dataSource() { 
     HikariConfig dataSourceConfig = new HikariConfig(); 
     dataSourceConfig.setJdbcUrl(env.getRequiredProperty("db.url")); 
     dataSourceConfig.setDriverClassName(env.getRequiredProperty("db.driver")); 
     dataSourceConfig.setUsername(env.getRequiredProperty("db.username")); 
     dataSourceConfig.setPassword(env.getRequiredProperty("db.password")); 
     return new HikariDataSource(dataSourceConfig); 
    } 

    /** 
    * The method that configures the entity manager factory 
    * */ 
    @Bean 
    LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Environment env) { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource); 
     entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
     entityManagerFactoryBean.setPackagesToScan("net.petrikainulainen.springdata.jpa.todo"); 

     Properties jpaProperties = new Properties(); 

     jpaProperties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect")); 
     jpaProperties.put("hibernate.hbm2ddl.auto", env.getRequiredProperty("hibernate.hbm2ddl.auto")); 
     jpaProperties.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql")); 
     jpaProperties.put("hibernate.format_sql", env.getRequiredProperty("hibernate.format_sql")); 

     entityManagerFactoryBean.setJpaProperties(jpaProperties); 

     return entityManagerFactoryBean; 
    } 

    /** 
    * The method that configures the transaction manager 
    * */ 
    @Bean 
    JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory); 
     return transactionManager; 
    } 
} 

Todo.java

@Entity 
@Table(name = "todos") 
public class Todo { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "title", nullable = false, length = 100) 
    private String title; 

    public Todo() { 
    } 
    //getter setter tostring 
} 

所有堆棧跟蹤:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
сен 02, 2015 2:54:49 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation 
INFO: HHH000204: Processing PersistenceUnitInfo [ 
    name: default 
    ...] 
sep 02, 2015 2:54:49 PM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {5.0.0.Final} 
sep 02, 2015 2:54:49 PM org.hibernate.cfg.Environment <clinit> 
INFO: HHH000206: hibernate.properties not found 
sep 02, 2015 2:54:49 PM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
sep 02, 2015 2:54:49 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> 
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final} 
sep 02, 2015 2:54:49 PM org.hibernate.dialect.Dialect <init> 
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect 
sep 02, 2015 2:54:50 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000227: Running hbm2ddl schema export 
sep 02, 2015 2:54:50 PM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000230: Schema export complete 
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'todoRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class entity.Todo 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:687) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:84) 
    at Main.main(Main.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 
Caused by: java.lang.IllegalArgumentException: Not an managed type: class entity.Todo 
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210) 
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68) 
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:67) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:90) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:70) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:171) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550) 
    ... 16 more 

Process finished with exit code 1 

回答

22

您的Todo類的名稱,如圖中的錯誤信息,是entity.Todo。所以它在包entity

但是你的實體管理器工廠的配置是這樣的:

entityManagerFactoryBean.setPackagesToScan("net.petrikainulainen.springdata.jpa.todo"); 

所以你entity包不被掃描,並且Todo實體因此未知的JPA。

+1

謝謝你一起,這解決了我的問題。也許你知道爲什麼當我使用'@ Autowired' *(刪除'ApplicationContext')時出現錯誤*我在'todoRepository.save(todo)'行中得到異常'線程中的異常'main「java.lang.NullPointerException'' –

+0

您沒有發佈TodoRepository的任何代碼行。如果這個答案解決了你的問題,你應該通過勾選問題旁邊的灰色標記來接受它。如果您遇到其他問題,請使用相關代碼詢問*另一個問題。 –

+0

奧基,我創造了新的問題! –

6

對於Spring引導,您必須在application.properties中定義entitymanager.packagesToScan屬性,如下所示;

entitymanager.packagesToScan = com.app.domain

0

在辦理休眠經常檢查包掃描repositoriesentityManagerFactory下與<context:component-scan base-package="com.company"/>

<jpa:repositories base-package="com.company" /> 
<bean class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" id="mysql_dataSource"> 
    <property name="driverClassName" value="${database.driverClassName}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" /> 
    <property name="testOnBorrow" value="${database.connectionPool.testOnBorrow}" /> 
    <property name="testOnReturn" value="${database.connectionPool.testOnReturn}" /> 
    <property name="testWhileIdle" value="${database.connectionPool.testWhileIdle}" /> 
    <property name="timeBetweenEvictionRunsMillis" value="${database.connectionPool.timeBetweenEvictionRunsMillis}" /> 
    <property name="numTestsPerEvictionRun" value="${database.connectionPool.numTestsPerEvictionRun}" /> 
    <property name="minEvictableIdleTimeMillis" value="${database.connectionPool.minEvictableIdleTimeMillis}" /> 
    <property name="maxWait" value="${database.connectionPool.maxWait}"/> 
    <property name="maxActive" value="${database.connectionPool.maxActive}"/> 
    <property name="maxIdle" value="${database.connectionPool.maxIdle}"/> 
    <property name="minIdle" value="${database.connectionPool.minIdle}"/> 
    <property name="initialSize" value="${database.connectionPool.initialSize}"/> 
    <property name="validationQuery" value="${database.connectionPool.validationQuery}" /> 
</bean> 

<bean class="org.springframework.orm.jpa.JpaTransactionManager" 
    id="transactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="persistenceUnit" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.company</value> 
     </list> 
    </property> 
    <property name="dataSource" ref="mysql_dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.archive.autodetection">class,hbm</prop> 
      <prop key="hibernate.hbm2ddl.auto">none</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
      <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.DefaultNamingStrategy</prop> 
      <prop key="hibernate.connection.charSet">UTF-8</prop> 
     </props> 
    </property> 
</bean> 
相關問題