In my SeatDAO I declare a findAll method with derived query. The DAO looks like this:
public interface SeatDAO extends CrudRepository<SeatDTO, Integer> {
@Lock(LockMode.PESSIMISTIC_READ)
Collection<SeatDTO> findAll();
}
When I now start the spring boot application along the PostgreSQL database, it gives me these errors:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'seatDAO' defined in demo.adapters.database.SeatDAO defined in @EnableJdbcRepositories declared on JdbcRepositoriesRegistrar.EnableJdbcRepositoriesConfiguration: Could not create query for public abstract java.util.Collection demo.adapters.database.SeatDAO.findAll(); Reason: No property 'findAll' found for type 'SeatDTO'
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.Collection demo.adapters.database.SeatDAO.findAll(); Reason: No property 'findAll' found for type 'SeatDTO'
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property 'findAll' found for type 'SeatDTO'
When I leave out pessimistic locking on findAll by dropping @Lock, the application runs without any problems.
What is the problem here and how can I solve this?
Thank you in advance.
The core issue lies in the
@Lock(LockMode.PESSIMISTIC_READ)annotation being incorrectly applied to thefindAll()method. Spring Data JPA's @Lock annotation is intended for locking individual entity instances, not for locking entire query results. The framework is attempting to interpretfindAll()as a property of the SeatDTO entity, leading to theRemove the @Lock annotation from the findAll() method:
Alternatives for Pessimistic Locking:
Lock individual entities within a transaction:
Java - Inside a transactional context