2013-10-25 50 views
57

嗯,我搜索了Google,發現了很多結果,但沒有一個能夠回答我的問題。所以,在這裏。Spring Data JPA - 「沒有找到類型的屬性」異常

我想通過做一個pinterest克隆的最小實現來研究Spring MVC和Spring Data JPA。所以,以下是我認爲與我的問題相關的部分代碼。

型號/實體

@Entity 
@Table(name = "pin_item") 
public class PinItem implements Serializable { 
    // properties ... 
    @JoinColumn(name = "board_id", referencedColumnName = "user_board_id") 
    @ManyToOne(optional = false) 
    private UserBoard board; 

    // getters and setters... 
} 

@Entity 
@Table(name = "user_board") 
public class UserBoard implements Serializable { 
    // properties ... 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "board") 
    private List<PinItem> pinItemList; 

    // getters and setters... 
} 

服務

@Service 
@Transactional(readOnly = true) 
public class BoardServiceImpl implements BoardService { 
    @Autowired 
    private UserBoardRepository boardRepository; 

    @Override 
    public List<UserBoard> findLatestBoards() { 
     PageRequest request = new PageRequest(
        0, PresentationUtil.PAGE_SIZE, 
        Sort.Direction.DESC, "boardId" 
     ); 
     return boardRepository.findAll(request).getContent(); 
    } 

    // Other Methods 
} 

public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> { 

} 

現在,當我撥打findLatestBoards方法BoardService,「找不到屬性」異常在線return boardRepository.findAll(request).getContent();上引發。這裏是tomcat日誌的摘錄。

DEBUG LOG

12:28:44,254 DEBUG AnnotationTransactionAttributeSource:106 - Adding transactional method 'findLatestBoards' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
12:28:44,254 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager' 
12:28:44,254 DEBUG JpaTransactionManager:366 - Creating new transaction with name [com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
12:28:44,254 DEBUG JpaTransactionManager:369 - Opened new EntityManager [[email protected]] for JPA transaction 
12:28:44,255 DEBUG AbstractTransactionImpl:158 - begin 
12:28:44,255 DEBUG LogicalConnectionImpl:212 - Obtaining JDBC connection 
12:28:44,255 DEBUG DriverManagerDataSource:162 - Creating new JDBC DriverManager Connection to [jdbc:mysql://localhost:3306/pic_pin] 
12:28:44,266 DEBUG LogicalConnectionImpl:218 - Obtained JDBC connection 
12:28:44,267 DEBUG JdbcTransaction:69 - initial autocommit status: true 
12:28:44,267 DEBUG JdbcTransaction:71 - disabling autocommit 
12:28:44,267 DEBUG JpaTransactionManager:401 - Exposing JPA transaction as JDBC transaction [org.springframewo[email protected]370da60e] 
12:28:44,274 DEBUG TransactionalRepositoryProxyPostProcessor$CustomAnnotationTransactionAttributeSource:286 - Adding transactional method 'findAll' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
12:28:44,274 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'transactionManager' 
12:28:44,274 DEBUG JpaTransactionManager:332 - Found thread-bound EntityManager [[email protected]] for JPA transaction 
12:28:44,274 DEBUG JpaTransactionManager:471 - Participating in existing transaction 
12:28:44,279 DEBUG CachedIntrospectionResults:159 - Not strongly caching class [java.io.Serializable] because it is not cache-safe 
12:28:44,281 DEBUG JpaTransactionManager:851 - Participating transaction failed - marking existing transaction as rollback-only 
12:28:44,281 DEBUG JpaTransactionManager:559 - Setting JPA transaction on EntityManager [[email protected]] rollback-only 
12:28:44,283 DEBUG JpaTransactionManager:844 - Initiating transaction rollback 
12:28:44,284 DEBUG JpaTransactionManager:534 - Rolling back JPA transaction on EntityManager [[email protected]] 
12:28:44,284 DEBUG AbstractTransactionImpl:203 - rolling back 
12:28:44,284 DEBUG JdbcTransaction:164 - rolled JDBC Connection 
12:28:44,285 DEBUG JdbcTransaction:126 - re-enabling autocommit 
12:28:44,285 DEBUG JpaTransactionManager:594 - Closing JPA EntityManager [[email protected]] after transaction 
12:28:44,285 DEBUG EntityManagerFactoryUtils:338 - Closing JPA EntityManager 
12:28:44,286 DEBUG LogicalConnectionImpl:232 - Releasing JDBC connection 
12:28:44,286 DEBUG LogicalConnectionImpl:250 - Released JDBC connection 
12:28:44,287 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard 
12:28:44,289 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard 
12:28:44,290 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.tecnooc.picpin.controller.BoardController.latest(javax.servlet.http.HttpSession,org.springframework.ui.Model)]: org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard 
12:28:44,291 DEBUG DispatcherServlet:959 - Could not complete request 

異常

例外情況是 「org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard」。但是,如果我理解正確,屬性存在於PinItem中,並正確映射到mappedBy = "board",UserBoard

org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard 
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75) 
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327) 
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353) 
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307) 
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271) 
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245) 
    at org.springframework.data.jpa.repository.query.QueryUtils.toJpaOrder(QueryUtils.java:408) 
    at org.springframework.data.jpa.repository.query.QueryUtils.toOrders(QueryUtils.java:372) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:456) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:437) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:319) 
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:289) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:318) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at com.sun.proxy.$Proxy147.findAll(Unknown Source) 
    at com.tecnooc.picpin.service.impl.BoardServiceImpl.findLatestBoards(BoardServiceImpl.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at com.sun.proxy.$Proxy148.findLatestBoards(Unknown Source) 
    at com.tecnooc.picpin.controller.BoardController.latest(BoardController.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

我不明白爲什麼會引發此異常。任何想法爲什麼發生?

注:我使用Hibernate作爲持久性提供者。另外,我放在這裏的代碼部分是我認爲與問題相關的部分。如果不是,請告訴我,我會用所需的部分更新問題。

+0

當我將嵌入式ID命名爲* MyCompositePK *並嘗試寫入* findByMyCompositePKUserId(Long userId)*時,我遇到了同樣的問題。重點是,對於CRUD存儲庫,它也需要是駱駝案例,以便在創建查詢時區分表格屬性。所以,它必須是* MyCompositePk *和* findByMyCompositePkUserId(Long userId)* – EmeraldTablet

回答

0

在JPA的關係有一個單一的所有者,並通過在UserBoard類使用mappedBy你告訴PinItem是該雙向關係的所有者,而在關係PinItem的屬性名爲board

在你UserBoard類,你沒有名爲board任何字段/屬性,但它有一個屬性pinItemList,所以你可能會嘗試使用屬性。

9

此錯誤,如果您嘗試訪問未存在財產

我的猜測是,排序是由彈簧做的property name,而不是由real column name發生。 並且錯誤表示在"UserBoard"中沒有名爲"boardId"的屬性。

最好成績,

橡樹

69

我遇到了同樣的問題,在這裏找到了解決辦法:http://java.dzone.com/articles/persistence-layer-spring-data

我已經改名爲一個實體屬性。但是通過Springs自定義查詢,爲舊屬性名稱定義了一個接口。

public interface IFooDAO extends JpaRepository< Foo, Long >{ 
    Foo findByOldPropName(final String name); 
} 

該錯誤表明它不能再找到「OldPropName」並拋出異常。

引述在DZone文章:

當春天的數據創建一個新的倉庫實現,分析由接口定義的所有方法,並嘗試自動生成的方法名稱查詢。雖然這具有侷限性,但它是一種非常強大和優雅的方式,可以用很少的努力來定義新的自定義訪問方法。 例如,如果被管理的實體具有名稱字段(和Java Bean的標準獲取和設置該字段),在DAO接口定義findByName方法會自動產生正確的查詢:

public interface IFooDAO extends JpaRepository< Foo, Long >{ 
    Foo findByName(final String name); 
} 

這是一個相對簡單的例子;查詢創建機制支持更大的一組關鍵字。

在解析器無法與域對象字段屬性相匹配的情況下,下面的異常被拋出:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo 
+0

我認爲這是最詳細和明確的答案,所以應該被接受。 – kmarabet

49

您的命名是不正確的

按照該documentation,如果你的資料​​庫是UserBoardRepository,您的自定義庫的實現應該命名爲UserBoardRepositoryImpl,在這裏你將其命名爲BoardServiceImpl,這就是爲什麼它拋出異常。

+0

另外,所有存儲庫類/接口都應該放在一個目錄中 - 據我所知 –

1

在我的情況下,我的方法名稱中有一個錯字(駱駝案例)。我將它命名爲「findbyLastName」並面對此異常。在我將它改爲「findByLastName」之後,異常消失了。

12

由於您的JPA庫的名字是UserBoardRepository,您的自定義接口的名稱應該是UserBoardRepositoryCustom(它應該與「定製」端)和實現類的名稱應該是UserBoardRepositoryImpl(應該默認地將Impl結束,你可以用不同的後綴使用庫,實現了一套-後綴屬性)

21

固定,將其設置在使用Spring的CrudRepository,我們要追加PROPERTYNAME之後正確findBy否則會給ÿ ou異常 「找不到此類型的型號」

我得到了這個異常。因爲屬性名稱和方法名稱不同步。

我已經使用下面的代碼訪問數據庫。

public interface UserDao extends CrudRepository<User, Long> { 
    User findByUsername(String username); 

和我的域用戶有財產。

@Entity 
public class User implements UserDetails { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "userId", nullable = false, updatable = false) 
    private Long userId; 
    private String username; 
+0

這種方法幫助我 - 我在存儲庫的'默認'(由CrudRepository接口提供)方法中使用了我的類的屬性的不正確名稱(即findByDateOfStatisticsBetween()我用findByDateBetween()方法命名) – ryzhman

0

如果使用Spring的引導你的項目,你可以嘗試在你的 Application.java添加此註釋。

@EnableJpaRepositories(repositoryFactoryBeanClass=CustomRepositoryFactoryBean.class) 
@SpringBootApplication 

public class Application {..... 
0

請注意:Zane XY和Alan B. Dee的答案相當不錯。但對於那些現在要使用Spring Boot和Spring Data的人來說,這將是一個更現代的答案。

假設你有一個類,如:

@Entity 
class MyClass { 
    @Id 
    @GeneratedValue 
    private Long id; 

    private String myClassName; 
} 

現在對於這個JpaRepository會是什麼樣

interface MyClassRepository extends JpaRepository { 
    Collection<MyClass> findByMyClassName(String myClassName); 
} 

現在你的「自定義」 方法找到必須拼寫Collection<MyClass> findByMyClassName(String myClassName)正是因爲春天需要有一些機制來映射此方法MyClass屬性myClassName

我想通了這一點,因爲對我來說,這似乎是自然的它的名字語義發現的一類,而實際上,synatxically通過myClassName

乾杯找到

相關問題