Hi There,
I’ve the following entity defined:
@Data
@Document
public class ApplicationEntity {
@Id
private String applicationId;
@Field
private String userId;
@Field
private String name;
@Field
private boolean active = true;
@CreatedDate
private ZonedDateTime createdAt;
@LastModifiedDate
private ZonedDateTime lastModifiedAt;
@Version
private long docVersion;
}
Then I have the following repository definition for this entity:
@Repository
public interface ApplicationRepository extends BaseRepository<ApplicationEntity, String> {
@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND active = true")
Page<ApplicationEntity> findByUserId(String userId, Pageable pageable);
@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND active = true")
ApplicationEntity findOne(String applicationId);
default ApplicationEntity findOneByUserIdAndApplicationId(final String userId, final String applicationId) {
val applicationEntity = findOne(applicationId);
if (applicationEntity == null || !applicationEntity.getUserId().equalsIgnoreCase(userId)) {
throw new RuntimeException("Application doesn't exist!");
}
return applicationEntity;
}
}
Retrieving applications via these repository methods are just fine. However if I try to update an entity using these methods, it fails with CASMismatchException
. If I remove findOne
method, update works just fine. My update method is like below:
@Override
public void disableApplication(final String userId, final String applicationId) {
final ApplicationEntity applicationEntity = repository.findOneByUserIdAndApplicationId(userId, applicationId);
applicationEntity.setActive(false);
repository.save(applicationEntity);
}
Am I missing something?
Update: I’m running my application with Spring Boot 1.5.1 (+ Spring Data Couchbase) against Couchbase 4.5.0-2601 Community Edition (build-2601) running on top of Docker.