11

I am new to the spring-data-jpa and am currently trying to implement with hibernate. I've followed the tutorial! for this and am currently facing issues starting the application itself. I get the following exception during startup:

 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) 

Customer is my domain class annotated with

@Entity(name = "customer") 

And I suppose it is trying to connect to the DB and fetch the customer table which I've actually configured. Here is my 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" /> 

And the DB is MYSQL which is running. Following are the properties:

# 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 

Please help me out in getting out of this issue!!

3 Answers 3

40

Sounds like the Repository interface you have specified for your Domain class contains a findXXX method whereas XXX is not a property of your Domain class.

Example:

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); } 

And your Domain class looks like this and misses the "name" property:

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

In your particular example it looks like you added a findByCustomer(Customer customer) method to your Repository interface (probably called something like CustomerRepository). You don't need that method as a findOne(<PrimaryKeyClass> id) method is automatically generated for you by Spring Data for JPA and you can just call it with the @Id of your Domain class Customer as a parameter.

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks for your response!! After spending a day, I've figured out that and removed that method from my repository. But findOne(<PrimaryKeyClass> id) idea sounds good. I'll try that!!.
It also fixed my problem, BUT what the ...? why would it want to map the query result from the name of the method?? it should done it from the parameters get from the DB, could you please elaborate further??
The way this works is that it's always the name of the attributes' getter/setter methods that are matched against the database columns. You can modify this by giving the attribute a different name and using the @Column("MyColumnName") annotation to manually do the mapping. If you don't do any of them (neither name matching or @Column) then the framework doesn't know how to map the query result against your object.
Thank you so much, I've been struggling with this for a day now and just couldn't understand what my problem was.
1

Spring ORM's LocalContainerEntityManagerFactoryBean (as of 3.1 i think) has a property called 'packagesToScan'. unless you've got additional vendor properties that you want to set through persistence.xml, remove the p:persistenceXmlLocation and replace with

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

this tells the LocalContainerEntityManagerFactoryBean where to find all your @Entity pojos and includes them in your EntityManagerFactory so Spring Data JPA can find where to put 'customer'

Comments

1

In my case I struggled with this error because of Spring case sensitivity.I searched by firstname, with the declaration in the domain class as firstName:

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

Only because the find method was declared as findByFirstname I got this error. It works after changing the letter n to N.

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.