2013-01-13 19 views
10

Sono nuovo per la primavera-data-jpa e sto attualmente cercando di implementare con la sospensione. Ho seguito lo tutorial! per questo e attualmente sto affrontando problemi a partire dall'applicazione stessa. ottengo la seguente eccezione durante l'avvio:dati di primavera jpa @Entity proprietà non trovata eccezione

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) 

cliente è la mia classe di dominio annotato con

@Entity(name = "customer") 

E suppongo che sta tentando di connettersi al DB e prendere la tabella dei clienti, che ho effettivamente configurato. Ecco la mia primavera-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" /> 

E il DB è MYSQL che è in esecuzione. Di seguito sono le proprietà:

# 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 

Per favore aiutatemi a uscire da questo problema !!

risposta

38

Suoni come l'interfaccia del repository che hai specificato per la tua classe Dominio contiene un metodo findXXX mentre XXX non è una proprietà della classe Dominio.

Esempio:

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

E la classe di dominio assomiglia a questo e non trova la proprietà "Name":

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

Nel vostro esempio particolare sembra che è stato aggiunto un metodo di findByCustomer(Customer customer) al repository interfaccia (probabilmente chiamata come CustomerRepository). Non è necessario questo metodo poiché il metodo findOne(<PrimaryKeyClass> id) viene generato automaticamente da Spring Data per JPA e puoi semplicemente chiamarlo con lo @Id della classe Dominio Customer come parametro.

+0

Grazie per la vostra risposta !! Dopo aver trascorso un giorno, l'ho capito e ho rimosso quel metodo dal mio repository. Ma l'idea findOne ( id) suona bene. Ci proverò !! – user1798932

+0

Ha risolto anche il mio problema, MA che ...? perché vorrebbe mappare il risultato della query dal nome del metodo ?? dovrebbe farlo dai parametri provenienti dal DB, potresti per favore elaborare ulteriormente ?? – azerafati

+0

Il modo in cui funziona è che è _always_ il nome dei metodi getter/setter degli attributi che sono confrontati con le colonne del database. È possibile modificare ciò dando l'attributo un nome diverso e utilizzando l'annotazione @Column ("MyColumnName") per eseguire manualmente la mappatura. Se non ne fai nessuno (né la corrispondenza del nome né @Column), il framework non sa come mappare il risultato della query sul tuo oggetto. –

1

Spring ORM LocalContainerEntityManagerFactoryBean (come da 3.1 penso) ha una proprietà chiamata 'packagesToScan'. se non hai le proprietà del fornitore aggiuntive che si desidera impostare tramite persistence.xml, rimuovere il p:persistenceXmlLocation e sostituirlo con

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

questo dice al LocalContainerEntityManagerFactoryBean dove trovare tutti i tuoi @Entity POJO e li include nella vostra EntityManagerFactory così primavera Dati JPA può trovare dove mettere "cliente"

1

Nel mio caso ho lottato con questo errore a causa del caso Primavera sensitivity.I cercato per prima cosa n ame, con la dichiarazione della classe di dominio come prima N ome:

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

Solo a causa il metodo find è stato dichiarato come findByFirstname. Ho ricevuto questo errore. Funziona dopo aver cambiato la lettera n a N.

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