2013-01-13 11 views
10

Jestem nowy w danych źródłowych-jpa i obecnie próbuję wprowadzić go w stan hibernacji. Śledziłem numer tutorial! do tego i obecnie borykam się z problemami rozpoczynającymi samą aplikację. otrzymuję następujący wyjątek podczas uruchamiania:dane sprężyny jpa @ Właściwość własność nie znaleziono wyjątek

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) 

klienta jest moja klasa domeny opatrzone

@Entity(name = "customer") 

I przypuszczam, że próbuje się połączyć z PB i pobrać tabelę klienta który ja faktycznie skonfigurowany. Oto moja wiosna-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" /> 

A DB MYSQL, który jest uruchomiony. Są następujące właściwości:

# 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 

Proszę mi pomóc w wyjściu z tego problemu !!

Odpowiedz

38

Wygląda na to, że interfejs repozytorium określony dla Twojej klasy Domain zawiera metodę findXXX, podczas gdy XXX nie jest własnością Twojej klasy Domeny.

Przykład:

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

I klasa Domain wygląda i strzela „nazwa” właściwość:

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

W danym przykładzie wygląda dodano metodę findByCustomer(Customer customer) do repozytorium interfejs (prawdopodobnie nazywane coś takiego jak CustomerRepository). Ta metoda nie jest potrzebna, ponieważ metoda automatycznie generuje dla ciebie metodę Spring Data for JPA i możesz ją wywołać z @Id swojej klasy Domain Customer jako parametrem.

+0

Dzięki za odpowiedź !! Po spędzeniu jednego dnia zorientowałem się, że i usunąłem tę metodę z mojego repozytorium. Ale pomysł findOne ( id) brzmi dobrze. Spróbuję tego !!. – user1798932

+0

Naprawiono też mój problem, ALE to, co ...? dlaczego chciałby zmapować wynik zapytania z nazwy metody? powinien zrobić to z parametrów otrzymanych z DB, czy mógłbyś dalej rozwinąć? – azerafati

+0

Sposób, w jaki to działa, polega na tym, że zawsze jest to nazwa metod getter/setter atrybutów, które są dopasowane do kolumn bazy danych. Możesz to zmienić, nadając atrybutowi inną nazwę i używając adnotacji @Column ("MojaNazwaLogowa"), aby ręcznie wykonać mapowanie. Jeśli nie wykonasz żadnego z nich (ani dopasowanie nazwy, ani @Column), wówczas struktura nie wie, jak zmapować wynik zapytania do twojego obiektu. –

1

Wiosna ORM na LocalContainerEntityManagerFactoryBean (od 3.1 chyba) ma właściwość o nazwie 'packagesToScan'. chyba że masz dodatkowe właściwości dostawcy, które mają być ustawione przez persistence.xml, usuń p:persistenceXmlLocation i zastąpić

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

ten opowiada LocalContainerEntityManagerFactoryBean gdzie można znaleźć wszystkie swoje @Entity POJOs i włącza je w swoim EntityManagerFactory więc wiosną Data JPA może znaleźć miejsce, w którym można umieścić "klienta":

1

W moim przypadku miałem problemy z tym błędem z powodu wiosennej przypadku sensitivity.I poszukiwanego przez pierwszy n ame, z deklaracją w klasie domeny jako pierwszy N Ame:

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

Tylko dlatego, metoda wyszukiwania została zadeklarowana jako findByFirstname Mam ten błąd. Działa po zmianie litery n do.

public Collection<User> findByFirstName(@Param("firstName") String firstname); 
Powiązane problemy