2013-01-13 10 views
10

Ich bin neu in der Feder-Daten-jpa und bin derzeit versucht, mit Hibernate zu implementieren. Ich habe die tutorial verfolgt! Dafür stehen derzeit Probleme, die Anwendung selbst zu starten. Ich erhalte die folgende Ausnahme bei der Inbetriebnahme:Federdaten jpa @Entity Eigenschaft nicht gefunden Ausnahme

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) 

Kunde ist meine Domain-Klasse

@Entity(name = "customer") 

mit

kommentierte Und ich nehme an, es wird versucht, an die DB zu verbinden und den Kunden Tisch holen, die ich habe tatsächlich konfiguriert. Hier ist meine Feder-Konfiguration:

<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" /> 

Und die DB ist MYSQL, die ausgeführt wird. Folgende sind die Eigenschaften:

# 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 

Bitte helfen Sie mir aus diesem Problem heraus!

Antwort

38

Sounds wie die Repository-Schnittstelle, die Sie für Ihre Domain-Klasse angegeben haben enthält eine Methode, während XXX ist keine Eigenschaft Ihrer Domain-Klasse.

Beispiel:

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

Und Ihre Domain-Klasse sieht wie folgt aus und verpasst den „Namen“ Eigenschaft:

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

In Ihrem speziellen Beispiel sieht es aus wie Sie ein findByCustomer(Customer customer) Methode zu Ihrem Repository hinzugefügt Schnittstelle (wahrscheinlich so etwas wie CustomerRepository genannt). Sie benötigen diese Methode nicht, da eine findOne(<PrimaryKeyClass> id)-Methode von Spring Data für JPA automatisch für Sie generiert wird, und Sie können sie einfach mit dem @Id Ihrer Domain-Klasse Customer als Parameter aufrufen.

+0

Vielen Dank für Ihre Antwort !! Nach einem Tag habe ich das herausgefunden und diese Methode aus meinem Repository entfernt. Aber findOne ( id) Idee klingt gut. Ich werde das versuchen !! – user1798932

+0

Es hat auch mein Problem behoben, ABER was zum ...? Warum sollte es das Abfrageergebnis vom Namen der Methode abbilden wollen? es sollte es aus den Parametern von der DB kommen, könntest du bitte weiter ausarbeiten ?? – azerafati

+0

Die Funktionsweise ist, dass es _always_ der Name der Getter/Setter-Methoden der Attribute ist, die mit den Datenbankspalten verglichen werden. Sie können dies ändern, indem Sie dem Attribut einen anderen Namen geben und die Annotation @Column ("MyColumnName") verwenden, um das Mapping manuell auszuführen. Wenn Sie keine von ihnen ausführen (weder Namensabgleich noch @Column), kann das Framework das Abfrageergebnis nicht mit Ihrem Objekt abgleichen. –

1

Spring ORM LocalContainerEntityManagerFactoryBean (ab 3.1 denke ich) hat eine Eigenschaft namens "packagesToScan". es sei denn, Sie zusätzliche Anbieter Eigenschaften haben, die Sie durch persistence.xml festlegen möchten, entfernen Sie die p:persistenceXmlLocation und ersetzen mit

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

dies erzählt die LocalContainerEntityManagerFactoryBean, wo Ihr alle @Entity POJOs zu finden und nimmt sie in Ihrem EntityManagerFactory so Frühling Data JPA kann wo finden, 'Kunden'

1

In meinem Fall habe ich mit diesem Fehler zu kämpfen, weil der Frühling Fall sensitivity.I durch erste n ame gesucht, mit der Erklärung, in der Domain-Klasse als erste N ame:

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

Nur weil Die Find-Methode wurde als findByFirstname deklariert. Ich habe diesen Fehler erhalten. Es funktioniert nach dem Ändern des Buchstabens n zu N.

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