Используя гильдии, созданные в сети, я создаю простую 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 ().
Контекст вопроса описан здесь: Какую распределенную базу данных мне нужно выбрать для проекта со средними данными
но если я удалю аннотацию @Entity из UserEntity, IllegalArgumentException: не управляемый тип: появится класс UserEntity.
Что ж, значит, на первый вопрос нет ответа. Пожалуйста, поделитесь хотя бы кодом UserEntity.
Также, пожалуйста, разделите свой вопрос на три - вы не должны задавать несколько несвязанных вопросов в одном на SO.




- 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.
- 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-адресов и номерами портов для связи. Теперь предположим, что один экземпляр запущен, он создаст внутри него один узел зажигания, а когда другой экземпляр будет запущен, в нем будет создан другой узел зажигания. Теперь два узла будут связываться друг с другом через указанный вами порт. Вы можете использовать этот кластер как распределенный кеш.
- 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 это).
Надеюсь, это вам поможет!
Большое спасибо, сэр, лучший ответ в сети
Первый вопрос решен здесь: stackoverflow.com/questions/47921860/springboot-jpa-and-igni te