Использование данных Spring с помощью PagingAndSortingRepository и IgniteRepository приводит к ошибке

#java #jpa #spring-data-jpa #spring-data #ignite

Вопрос:

Я работаю над проектом spring data и пытаюсь интегрировать с ним кэш Ignite. Я уже использовал PagingAndSortingRepository<Сущность, строка>

    @Repository public interface UserRepository extends PagingAndSortingRepository<User, String> {
    
        Page<User> findByUserId(final String userId, final Pageable pageable);
    
        Page<User> findByFirstName(final String firstName, final Pageable pageable);
    
        Page<User> findByEmailAddress(final String emailAddress, final Pageable pageable);
            
        Page<User> findAllBy(final Pageable pageable); 
}
 

и я добавил новый репозиторий IgniteRepository<Сущность, строка>

 @RepositoryConfig(cacheName = "UserCache")
public interface UserCacheRepository extends IgniteRepository<UserCacheDto, String> {

    @Query("select UserCacheDto FROM UserCacheDto WHERE userId = ?")
    List<UserCacheDto> findByUserId(final String userId);

    @Query("select UserCacheDto FROM UserCacheDto WHERE firstName = ?")
    List<UserCacheDto> findByFirstName(final String firstName);

    @Query("select UserCacheDto FROM UserCacheDto WHERE emailAddress = ?")
    List<UserCacheDto> findByEmailAddress(final String emailAddress);

}
 

Идея этой настройки заключалась в том, чтобы извлекать данные из базы данных только в том случае, если данные не найдены в кэше

Ниже приведены зависимости моего проекта

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<groupId>com.src.portal</groupId>
<artifactId>portalDataBaseCacheModule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>portalDataBaseCacheModule</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
    <spring.version>2.5.4</spring.version>
    <ignite.version>2.9.0</ignite.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
        <version>2.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.200</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-spring-data_2.2</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-core</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-spring-boot-autoconfigure-ext</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-zookeeper</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-log4j2</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.8.Final</version>
    </dependency>
    <dependency>
        <groupId>org.apache.ignite</groupId>
        <artifactId>ignite-log4j</artifactId>
        <version>${ignite.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
        <version>4.2</version>
    </dependency>
    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>18.3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains</groupId>
        <artifactId>annotations</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
 

После выполнения этой интеграции я получаю следующую ошибку компиляции,

java: столкновение имен: deleteAllById(java.lang.Итерируемый) в org.apache.ignite.springdata22.репозиторий.ВосплаМеняющийся и удаляющий идентификатор(java.lang.Повторяемый расширяет идентификатор>) в org.springframework.data.repository.У CrudRepository есть такое же стирание, но ни одно из них не переопределяет другое

Из ошибки следует, что каким-то образом, поскольку оба репозитория внутренне расширяют CrudRepository, это вызывает проблему, я не могу понять, почему и как решить эту проблему. Пожалуйста, помогите здесь.

Ответ №1:

В соответствии с вашей ошибкой UserCacheRepository наследуется IgniteRepository.deleteAllById(Iterable<K> ids) и CrudRepository.deleteAllById(Iterable<? extends ID> ids) , но стирается для Iterable<K> и Iterable<? extends ID> будет одинаковым (просто Iterable ), поэтому мы попадаем в ситуацию, когда класс имеет два метода с абсолютно одинаковыми сигнатурами, и это приводит к ошибке столкновения имен.

Основная причина этой ошибки заключается в том, что IgniteRepository изначально она была написана, когда CrudRepository у нее не было deleteAllById() метода, CrudRepository в то время как в современных версиях spring-boot-starter-data-jpa есть этот метод.

Вы можете попробовать использовать более старую версию для весенних данных, если это возможно для остальной части вашего приложения.

Также вы можете попытаться явно переопределить метод deleteAllById(Итерационный итерационный), но я не уверен, поможет ли это.

Лучший вариант-обновить расширения apache-ignite для работы с последними данными spring, чтобы вы могли создать для этого билет Jira в проекте Apache Ignite.