2013-01-13 45 views
10

मैं वसंत-डेटा-जेपीए में नया हूं और वर्तमान में हाइबरनेट के साथ कार्यान्वित करने की कोशिश कर रहा हूं। मैंने tutorial का पालन किया है! इसके लिए और वर्तमान में आवेदन शुरू करने के मुद्दों का सामना कर रहा हूं। मैं स्टार्टअप के दौरान निम्न अपवाद प्राप्त करें:वसंत डेटा जेपीए @ एंटीटी संपत्ति को अपवाद नहीं मिला

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) 

ग्राहक मेरे डोमेन वर्ग

@Entity(name = "customer") 

साथ एनोटेट है और मैं यह DB से कनेक्ट और ग्राहक तालिका जो मैंने लाने के लिए कोशिश कर रहा है लगता है वास्तव में कॉन्फ़िगर किया गया। यहां मेरी वसंत-कॉन्फ़िगरेशन है:

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

और डीबी MYSQL है जो चल रहा है। निम्नलिखित गुण हैं:

# 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 

कृपया इस मुद्दे से बाहर निकलने में मेरी सहायता करें !!

उत्तर

38

आपके डोमेन वर्ग के लिए निर्दिष्ट रेपॉजिटरी इंटरफेस की तरह लगता है कि findXXX विधि है जबकि XXX आपकी डोमेन क्लास की संपत्ति नहीं है।

उदाहरण:

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

और अपने डोमेन वर्ग इस तरह दिखता है और "नाम" याद करते हैं संपत्ति:

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

अपने विशिष्ट उदाहरण में ऐसा लगता है कि आप अपने भंडार के लिए एक findByCustomer(Customer customer) विधि जोड़ा इंटरफ़ेस (शायद CustomerRepository जैसे कुछ कहा जाता है)। आपको उस विधि की आवश्यकता नहीं है क्योंकि findOne(<PrimaryKeyClass> id) विधि आपके लिए जेपीए के लिए स्प्रिंग डेटा द्वारा स्वचालित रूप से जेनरेट की गई है और आप इसे पैरामीटर के रूप में अपने डोमेन क्लास Customer के @Id के साथ कॉल कर सकते हैं।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद !! एक दिन बिताने के बाद, मैंने यह पता लगाया है और उस विधि को मेरे भंडार से हटा दिया है। लेकिन findOne ( id) विचार अच्छा लगता है। मैं कोशिश करूँगा !! – user1798932

+0

यह मेरी समस्या भी तय करता है, लेकिन क्या ...? विधि के नाम से क्वेरी परिणाम मैप करना क्यों चाहेंगे ?? इसे डीबी से प्राप्त पैरामीटर से किया जाना चाहिए, क्या आप कृपया आगे विस्तार कर सकते हैं ?? – azerafati

+0

जिस तरह से यह काम करता है वह यह है कि यह _always_ गुणों के नाम 'गेटर/सेटर विधियों का नाम है जो डेटाबेस कॉलम के साथ मेल खाते हैं। आप गुण को एक अलग नाम देकर और मैकिंग मैन्युअल रूप से करने के लिए @ कॉलम ("MyColumnName") एनोटेशन का उपयोग करके इसे संशोधित कर सकते हैं। यदि आप उनमें से कोई भी नहीं करते हैं (न तो नाम मिलान या @ कॉलम) तो ढांचे को पता नहीं है कि आपके ऑब्जेक्ट के विरुद्ध क्वेरी परिणाम कैसे मैप करना है। –

1

वसंत ORM का LocalContainerEntityManagerFactoryBean (3.1 मुझे लगता है) के पास 'packagesToScan' नामक एक संपत्ति है। जब तक आप अतिरिक्त विक्रेता गुण है कि आप persistence.xml के माध्यम से सेट करना चाहते हैं मिल गया है, p:persistenceXmlLocation हटाने और

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

के साथ बदलें इस बताता LocalContainerEntityManagerFactoryBean जहां अपने सभी @Entity POJOs खोजने के लिए और उन्हें इतना वसंत अपने EntityManagerFactory में शामिल डेटा जेपीए यह पता लगा सकता है कि 'ग्राहक'

1

मेरे मामले में मैं क्योंकि वसंत मामले की इस त्रुटि sensitivity.I पहले n एएमई द्वारा खोजा गया के साथ संघर्ष किया, पहले एन एएमई के रूप में डोमेन कक्षा में घोषणा के साथ:

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

केवल क्योंकि खोज विधि को findByFirstname के रूप में घोषित किया गया था मुझे यह त्रुटि मिली। यह एन से एन को बदलने के बाद काम करता है।

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