Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spring data jpa @Entity property not found exception

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!!

like image 592
user1798932 Avatar asked Jan 13 '13 13:01

user1798932


People also ask

What is the difference between entityexistsexception and JPA exception?

Simillarly to Hibernate, the EntityExistsException JPA exception will also be wrapped by the Spring Exception Translation into a DataIntegrityViolationException. The only difference is that JPA itself is already high level which makes this JPA exception the only potential cause of data integrity violations.

What is entity annotation in JPA?

An entity represents a table stored in a database. Every instance of an entity represents a row in the table. 2.1. The Entity Annotation Let's say we have a POJO called Student which represents the data of a student and we would like to store it in the database. In order to do this, we should define an entity so that JPA is aware of it.

How to generate a JPA entity’s ID?

Each JPA entity must have a primary key which uniquely identifies it. The @Id annotation defines the primary key. We can generate the identifiers in different ways which are specified by the @GeneratedValue annotation. We can choose from four id generation strategies with the strategy element. The value can be AUTO, TABLE, SEQUENCE, or IDENTITY.

How to check if entity does not exist in hibernate?

You can use the @NotFound annotation with the value NotFoundAction.IGNORE, which will return null if an associated entity doesn't exist. A word of caution: if you use this in a collections and hibernate doesn't find one of the entries, it will add a null value in the collection, which is very annoying.


2 Answers

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.

like image 128
Rias A. Sherzad Avatar answered Oct 04 '22 22:10

Rias A. Sherzad


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'

like image 39
incomplete-co.de Avatar answered Oct 04 '22 21:10

incomplete-co.de