2013-01-13 31 views
10

我是spring-data-jpa的新手,目前正試圖用hibernate實現。我遵循tutorial!爲此,我目前面臨啓動應用程序本身的問題。 我在啓動過程中出現以下情況例外:spring data jpa @Entity屬性沒有發現異常

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property customer found for type com.adaptris.dashboard.customer.Customer 
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:74) 
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:326) 
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:352) 
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:306) 
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:270) 
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:244) 
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:73) 
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180) 
at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260) 
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240) 
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:71) 
at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:57) 
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:90) 
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162) 
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:68) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:280) 
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:148) 
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125) 
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41) 
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 

客戶是我的域類註解爲

@Entity(name = "customer") 

而且我想它正試圖連接到數據庫並獲取客戶表我已經實際配置。這裏是我的spring-config:

<tx:annotation-driven transaction-manager="transactionManager" /> 
<!-- Activate Spring Data JPA repository support --> 
<jpa:repositories base-package="com.adaptris.dashboard.customer" /> 

    <!-- Declare a datasource that has pooling capabilities --> 
<bean id="jpaDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close" p:driverClass="${app.jdbc.driverClassName}" 
    p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}" 
    p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100" 
    p:maxStatements="50" p:minPoolSize="10" /> 

<!-- Declare a JPA entityManagerFactory --> 
<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:persistenceXmlLocation="classpath*:META-INF/persistence.xml" 
    p:persistenceUnitName="hibernatePersistenceUnit" p:dataSource-ref="jpaDataSource" 
    p:jpaVendorAdapter-ref="hibernateVendor" /> 

<!-- Specify our ORM vendor --> 
<bean id="hibernateVendor" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
    p:showSql="false" /> 

<!-- Declare a transaction manager --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
    p:entityManagerFactory-ref="entityManagerFactory" /> 

而DB是運行的MYSQL。以下是屬性:

# database properties 
app.jdbc.driverClassName=com.mysql.jdbc.Driver 
app.jdbc.url=jdbc\:mysql\://Mallik-PC/adaptrisschema 
app.jdbc.username=dbuser 
app.jdbc.password=dbpassword 

請幫我解決這個問題!

回答

38

聽起來像您爲Domain類指定的Repository接口包含findXXX方法,而XXX不是您的Domain類的屬性。

例子:

public interface UserRepository extends CrudRepository<User, String> { 

    /** 
    * Finds a user by name. 
    * 
    * @param name The name of the User to find. 
    * @return The User with the given name. 
    */ 
    public User findByName(String name); 
} 

和域類看起來像這樣,錯過了「名」屬性:

@Entity 
public class User { 
    private String firstname; 
    private String lastname; 
    // No "private String name" in here! 
    ... 
} 

在您的具體的例子,它看起來像你添加一個findByCustomer(Customer customer)方法到存儲庫界面(可能叫做CustomerRepository)。您不需要該方法,因爲Spring Data for JPA會自動爲您生成findOne(<PrimaryKeyClass> id)方法,您可以使用域類Customer@Id作爲參數來調用它。

+0

感謝您的回覆!花了一天之後,我已經想通了,並從我的存儲庫中刪除了該方法。但findOne( id)的想法聽起來不錯。我會盡力的! – user1798932

+0

它也解決了我的問題,但是什麼...?爲什麼要從方法的名稱映射查詢結果?它應該從數據庫中獲取的參數完成,請您詳細說明一下嗎? – azerafati

+0

工作方式是_always_是與數據庫列匹配的屬性的getter/setter方法的名稱。您可以通過賦予該屬性不同的名稱並使用@Column(「MyColumnName」)註釋手動進行映射來修改此操作。 如果你沒有做任何一個(既沒有名稱匹配也沒有@Column),那麼框架不知道如何將查詢結果映射到你的對象。 –

1

Spring ORM的LocalContainerEntityManagerFactoryBean(截至3.1我認爲)有一個名爲'packagesToScan'的屬性。除非你已經得到了你想要通過persistence.xml中設置附加供應商屬性,去掉p:persistenceXmlLocation

p:packagesToScan="[package name where your entities are]" 

更換這告訴LocalContainerEntityManagerFactoryBean在哪裏可以找到你的所有@Entity POJO和包括他們在您的EntityManagerFactory所以Spring數據JPA可以找到放置'客戶'的位置

1

在我來說,我有這個錯誤,因爲春天案sensitivity.I搜查第一ň AME明爭暗鬥,在域類的聲明作爲第一ñ AME:

@Entity 
public class User { 
    private String firstName; 
... 

只是因爲查找方法被宣佈爲findByFirstname我得到這個錯誤。它在將字母n更改爲N後生效。

public Collection<User> findByFirstName(@Param("firstName") String firstname);