Ya, saya mencari di Google dan menemukan banyak hasil, tetapi tidak satupun dari mereka dapat menjawab masalah saya. Jadi, ini dia.
Saya mencoba mempelajari Spring MVC dan Spring Data JPA dengan melakukan implementasi minimal pinterest clone. Jadi, berikut adalah bagian-bagian kode yang menurut saya relevan dengan masalah saya.
Model / Entitas
@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...
}
Layanan
@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
}
Gudang
public interface UserBoardRepository extends JpaRepository<UserBoard, Integer> {
}
Sekarang, ketika saya memanggil findLatestBoards
metode ini BoardService
, pengecualian "Tidak Ditemukan Properti" dilempar ke telepon return boardRepository.findAll(request).getContent();
. Berikut adalah kutipan dari tomcat log.
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 [org.hibernate.ejb.EntityManagerImpl@75284194] 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.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@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 [org.hibernate.ejb.EntityManagerImpl@75284194] 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 [org.hibernate.ejb.EntityManagerImpl@75284194] 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 [org.hibernate.ejb.EntityManagerImpl@75284194]
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 [org.hibernate.ejb.EntityManagerImpl@75284194] 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
Pengecualian
Pengecualiannya adalah " org.springframework.data.mapping.PropertyReferenceException: No property board found for type com.tecnooc.picpin.model.UserBoard
". Tetapi, jika saya mengerti dengan benar, properti board
itu ada di PinItem
dan dipetakan dengan benar mappedBy = "board"
di 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)
Saya tidak mengerti mengapa pengecualian ini dilemparkan. Tahu mengapa itu terjadi?
Catatan: Saya menggunakan Hibernate sebagai penyedia Persistence. Juga, bagian kode yang saya masukkan di sini adalah apa yang menurut saya relevan dengan masalah tersebut. Jika tidak, beri tahu saya dan saya akan memperbarui pertanyaan dengan porsi yang diperlukan.
sumber
Jawaban:
Saya mengalami masalah yang sama ini dan menemukan solusinya di sini: https://dzone.com/articles/persistence-layer-spring-data
Saya telah mengganti nama properti entitas. Namun dengan Kueri Kustom Otomatis Pegas, ada antarmuka yang ditentukan untuk nama properti lama.
Kesalahan menunjukkan bahwa ia tidak dapat lagi menemukan "OldPropName" dan melontarkan pengecualian.
Mengutip artikel di DZone:
Saat Spring Data membuat implementasi Repositori baru, Spring Data menganalisis semua metode yang ditentukan oleh antarmuka dan mencoba menghasilkan kueri secara otomatis dari nama metode. Meskipun memiliki keterbatasan, ini adalah cara yang sangat kuat dan elegan untuk menentukan metode akses ubahsuaian dengan sedikit usaha. Misalnya, jika entitas yang dikelola memiliki bidang nama (dan pengambil dan penyetel standar Java Bean untuk bidang itu), menentukan metode findByName di antarmuka DAO akan secara otomatis menghasilkan kueri yang benar:
Ini adalah contoh yang relatif sederhana; kumpulan kata kunci yang jauh lebih besar didukung oleh mekanisme pembuatan kueri.
Jika parser tidak dapat mencocokkan properti dengan bidang objek domain, pengecualian berikut akan dilemparkan:
sumber
Penamaan Anda salah .
Sesuai dokumentasinya , jika repositori Anda adalah
UserBoardRepository
, implementasi dari repositori kustom Anda harusUserBoardRepositoryImpl
dinamai, di sini Anda menamakannya sebagaiBoardServiceImpl
, itulah mengapa ia melontarkan pengecualian.sumber
BoardServiceImpl
hanyalah layanan yang menggunakanUserBoardRepository
.Diperbaiki, Saat menggunakan
CrudRepository
Spring, kami harus menambahkan nama properti dengan benar setelah findBy jika tidak, Anda akan mendapat pengecualian "Tidak Ada Properti untuk Jenis"Saya mendapatkan pengecualian ini sebagai. karena nama properti dan nama metode tidak sinkron.
Saya telah menggunakan kode di bawah ini untuk DB Access.
dan Pengguna Domain saya memiliki properti.
sumber
findStatusId
salahfindByStatusId
benar dan untuk beberapa penamaan periksa stackoverflow.com/a/32796493/944593Karena nama repositori JPA Anda adalah UserBoardRepository , nama Antarmuka kustom Anda harus UserBoardRepositoryCustom (harus diakhiri dengan 'Kustom') dan nama kelas implementasi Anda harus UserBoardRepositoryImpl (harus diakhiri dengan Impl; Anda dapat menyetelnya dengan postfix berbeda menggunakan repositori- properti impl-postfix )
sumber
kesalahan ini terjadi jika Anda mencoba mengakses properti yang tidak ada
tebakan saya adalah bahwa penyortiran dilakukan oleh musim semi oleh
property name
dan bukan olehreal column name
. dan kesalahan menunjukkan bahwa,"UserBoard"
tidak ada properti bernama"boardId"
.bests,
ek
sumber
A
dan kelasB
yang meluasA
dan memiliki propertix
. Itu mengeluh bahwa tidak dapat menemukan propertix
di kelasA
...Dalam kasus saya, saya mengalami kesalahan ketik (kasus unta) di nama metode saya. Saya menamakannya menjadi "findbyLastName" dan menghadapi pengecualian ini. Setelah saya mengubahnya menjadi "findByLastName" pengecualian hilang.
sumber
Perhatikan di sini: jawaban dari Zane XY dan Alan B. Dee cukup bagus. Namun bagi Anda yang akan menggunakan Spring Boot sekarang, dan Spring Data, inilah jawaban yang lebih modern.
Misalkan Anda memiliki kelas seperti:
Sekarang
JpaRepository
untuk ini akan terlihat sepertiSekarang metode pencarian "khusus" Anda harus dieja dengan
Collection<MyClass> findByMyClassName(String myClassName)
tepat karena Spring perlu memiliki beberapa mekanisme untuk memetakan metode ini padaMyClass
propertimyClassName
!Saya menemukan ini karena, bagi saya, tampak wajar untuk menemukan kelas dengan namanya secara semantik , padahal, secara sinataksis Anda temukan dengan myClassName
Bersulang
sumber
sepertinya nama metode JpaRepository kustom Anda tidak cocok dengan Variabel apa pun di kelas entitas Anda. Pastikan nama metode Anda cocok dengan variabel di kelas entitas Anda
misalnya: Anda mendapatkan nama variabel yang disebut "aktif" dan metode JpaRepository khusus Anda mengatakan "findByActiveStatus" dan karena tidak ada variabel yang disebut "activeStatus", metode ini akan menampilkan "PropertyReferenceException"
sumber
Silakan Periksa nama properti di panggilan yang sebenarnya dari repo ei repository.findByUsername (nama pengguna)
sumber
Di JPA, sebuah hubungan memiliki satu pemilik, dan dengan menggunakan
mappedBy
diUserBoard
kelas Anda, Anda mengetahui bahwa ituPinItem
adalah pemilik dari hubungan dua arah tersebut, dan bahwa properti dalamPinItem
hubungan tersebut dinamaiboard
.Di
UserBoard
kelas Anda, Anda tidak memiliki bidang / properti dengan namaboard
, tetapi memiliki propertipinItemList
, jadi Anda dapat mencoba menggunakan properti itu sebagai gantinya.sumber
Jika proyek Anda menggunakan Spring-Boot, Anda dapat mencoba menambahkan anotasi ini di Application.java Anda.
sumber
Anda harus menerima halaman penggunaan, seperti ini
sumber
Anda harus menetapkan properti tersebut dalam model atau kelas entitas Anda.
sumber
Saya memiliki masalah serupa yang menyebabkan saya pusing selama berjam-jam.
Metode repositori saya adalah:
Saya mendapat kesalahan, bahwa tipe properti tidak ditemukan untuk tipe ResultClass.
Solusinya adalah, jpa / hibernate tidak mendukung bentuk jamak? Namun demikian, menghapus 's' memecahkan masalah:
sumber
Saya memiliki pengecualian ini baru-baru ini ketika pindah ke versi boot musim semi yang lebih baru (dari 1.5.4 ke 1.5.20). Masalahnya ada pada struktur paket repositori.
Masalah: Di bawah paket yang sama adalah paket: repository, repositoryCustom dan repositoryImpl.
Solusi: Atur ulang paket repositori sehingga paket repositori berisi paket repositoryCustom dan paket repositoryCustom berisi repositoryImpl:
sumber
Skenario lain, yang belum disebutkan di sini, yang menyebabkan kesalahan ini adalah API yang menerima
Pageable
(atauSort
) dan meneruskannya, sebagaimana adanya, ke repositori JPA saat memanggil API dari Swagger.Nilai default swagger untuk
Pageable
parameter adalah ini:Perhatikan di
"string"
sana yang merupakan properti yang memang ada. Menjalankan API tanpa menghapus atau mengubahnya akan menyebabkanorg.springframework.data.mapping.PropertyReferenceException: No property string found for type ...
sumber