Apache Ignite 2.7 IgniteRepository с JPA2 не внедряется

Используя гильдии, созданные в сети, я создаю простую Spring Boot 2 с приложением Spring Data JPA 2. Поддержка Spring Boot JPA 2 добавлена ​​в Apache Ignite только с версией 2.7 (теперь она доступна только для ночных сборок - Дата выпуска Apache Ignite 2.7). Есть фрагменты кода: Конфигурация:

@Configuration
@EnableIgniteRepositories
public class SpringDataConfig {

    @Bean
    public Ignite igniteInstance() {
        IgniteConfiguration config = new IgniteConfiguration();

        config.setIgniteInstanceName("ignite-1");
        config.setPeerClassLoadingEnabled(true);

        CacheConfiguration cache = new CacheConfiguration("usersCache");
        cache.setIndexedTypes(Integer.class, UserEntity.class);

        config.setCacheConfiguration(cache);
        Ignite ignite = Ignition.start(config);
        ignite.cluster().active(true);
        return ignite;
    }}

Репозиторий:

@RepositoryConfig(cacheName = "usersCache")
public interface UsersRepository extends IgniteRepository<UserEntity, Integer> {
    UserEntity getByUsername(String username);
}

И сервис:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
//    UsersRepository repository;
    ApplicationContext context;

    @Override
    public UserEntity getByUsername(String username) {
        return context.getBean(UsersRepository.class).getByUsername(username);
    }}

При запуске у меня следующее исключение:

[09:59:18] Ignite node started OK (id=8497f64c, instance name=ignite-1)
[09:59:18] Topology snapshot [ver=1, locNode=8497f64c, servers=1, clients=0, state=ACTIVE, CPUs=4, offheap=1.5GB, heap=1.7GB]
..

Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Iterable org.apache.ignite.springdata20.repository.IgniteRepository.save(java.util.Map)! No property save found for type UserEntity!
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:82)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:103)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:208)
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:79)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:565)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(RepositoryFactorySupport.java:558)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Iterator.forEachRemaining(Iterator.java:116)
    at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1049)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.mapMethodsToQuery(RepositoryFactorySupport.java:560)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$new$0(RepositoryFactorySupport.java:550)
    at java.util.Optional.map(Optional.java:215)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:550)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:323)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$4(RepositoryFactoryBeanSupport.java:290)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:141)
    at org.springframework.data.util.Lazy.get(Lazy.java:63)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:293)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:102)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695)
    ... 67 more
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property save found for type UserEntity!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:334)
    at org.springframework.data.mapping.PropertyPath.lambda$from$0(PropertyPath.java:287)
    at java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:324)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:269)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:252)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:81)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.lambda$new$0(PartTree.java:250)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:251)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.lambda$new$0(PartTree.java:380)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:381)
    at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:93)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:76)
    ... 93 more

В моем репозитории нет объявлений функций save *. Только getByUsername ().

  1. Как я могу исправить эту ошибку?
  2. Как я могу подключить несколько узлов зажигания и работает с ними как с единой базой данных?
  3. У меня есть база данных PostgreSQL. Могу ли я использовать их с Ignite? (Я смотрю на драйверы ignite JDBC и обнаружил, что драйвера PostgreSQL не существует, поддерживаются только MySQL, SQL Server, H2 и т. д. Но есть простой драйвер JDBC из их).

Контекст вопроса описан здесь: Какую распределенную базу данных мне нужно выбрать для проекта со средними данными

Первый вопрос решен здесь: stackoverflow.com/questions/47921860/springboot-jpa-and-igni‌ te

Meteo ir3 29.11.2018 11:34

но если я удалю аннотацию @Entity из UserEntity, IllegalArgumentException: не управляемый тип: появится класс UserEntity.

Meteo ir3 29.11.2018 12:00

Что ж, значит, на первый вопрос нет ответа. Пожалуйста, поделитесь хотя бы кодом UserEntity.

Stanislav Lukyanov 03.12.2018 19:26

Также, пожалуйста, разделите свой вопрос на три - вы не должны задавать несколько несвязанных вопросов в одном на SO.

Stanislav Lukyanov 03.12.2018 19:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
1 151
1

Ответы 1

  1. How can I fix that error?

Я была такая же проблема. Когда мы пытаемся использовать репозитории JPA и репозитории Ignite вместе, Spring рассматривает репозиторий Ignite как репозиторий JPA, поскольку он также расширяется из интерфейса репозитория. Он пытается предоставить реализацию для нашего IgniteRepository как JpaRepository, что не удастся, потому что используемые объекты не являются объектами Jpa.

Поэтому нам нужно исключить интерфейсы IgniteRepository из конфигурации JpaRepository. Для этого вы можете добавить аннотацию под @SpringBootApplication annotation.

@EnableJpaRepositories(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = RepositoryConfig.class)})

Теперь все интерфейсы IgniteRepository (помеченные @RepositoryConfig) будут исключены из конфигураций Jpa.

  1. How can I connect few ignite nodes and works with them like a single Database?

Все просто, вам нужно сформировать кластер зажигания. Существует два типа экземпляров Ignite: один запускается отдельно в экземпляре, а другой - внутри другого приложения (например, приложения Spring Boot). В вашем случае вы пытаетесь создать экземпляр ignite в приложении Spring Boot. Чтобы ответить на ваш вопрос, вам необходимо настроить DiscoverySpi и CommunicationSpi.

Это означает, что вы должны настроить IP-адреса узлов, на которых вы хотите запустить Ignite Instance, и порты для связи. Просто просмотрите документацию.

Но я объясню сценарий, в котором мы это использовали. Мы разработали приложение, которое работает на 4 экземплярах. Итак, мы настроили Ignite с 4-мя экземплярами IP-адресов и номерами портов для связи. Теперь предположим, что один экземпляр запущен, он создаст внутри него один узел зажигания, а когда другой экземпляр будет запущен, в нем будет создан другой узел зажигания. Теперь два узла будут связываться друг с другом через указанный вами порт. Вы можете использовать этот кластер как распределенный кеш.

  1. I have existing PostgreSQL database. Can I use them with Ignite? (I'm looking at ignite JDBC drivers and found that no PostgreSQL driver exists, onlyMySQL, SQL Server, H2 etc supported. But there is plain JDBC Driver among them).

Существует абстрактный класс CacheStoreAdapter. Вам просто нужно создать класс, расширяющий этот адаптер, и предоставить вашу собственную реализацию. Он действует как постоянное хранилище. Можно использовать любую технологию.

Вы храните данные в кэше зажигания. Зажигайте, чтобы сохранить их в БД. Собственно он вызовет методы CacheStoreAdapter, вот и все. Какую бы реализацию вы ни дали, она будет выполнена. У него есть метод записи. Если вы просто заставите его печатать данные на консоли, он будет печатать на консоли. Если вы сохраните его в БД с помощью JPA, он будет хранить. Можете дать любую реализацию. Это не зависит от драйверов или чего-то еще, только ваша реализация CacheStoreAdapter

Проблема здесь в том, что созданный вами адаптер не является управляемым компонентом Spring, поэтому вы не сможете напрямую внедрить Jpa Repo или какие-либо компоненты Spring, но вы можете сделать это косвенно (Google это).

Надеюсь, это вам поможет!

Большое спасибо, сэр, лучший ответ в сети

hossein bakhtiari 06.09.2020 01:04

Другие вопросы по теме