Hi,
I need to cache a legacy database having with auto increment key and already 
containing records. 
When I try to insert a new record I have this error: 
Caused by: class org.apache.ignite.IgniteCheckedException: Key is missing from 
query
    at 
org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.createSupplier(UpdatePlanBuilder.java:330)
    at 
org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForInsert(UpdatePlanBuilder.java:195)
    at 
org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForStatement(UpdatePlanBuilder.java:81)
    at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.getPlanForStatement(DmlStatementsProcessor.java:412)
    at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFields(DmlStatementsProcessor.java:140)
    at 
org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFieldsTwoStep(DmlStatementsProcessor.java:198)
    at 
org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryTwoStep(IgniteH2Indexing.java:1659)


My legacy table CUSTOMER:
    id                                 BIGINT            NOT NULL 
AUTO_INCREMENT    
    ,login                             VARCHAR(50)        NOT NULL
    ,email                            VARCHAR(100)    NOT NULL
    ,firstname                        VARCHAR(100)     
    ,lastname                        VARCHAR(100)
    ,phone                            VARCHAR(50)
    ,age                            INTEGER
    ,creation_date                     TIMESTAMP        NOT NULL 
    ,update_date                     TIMESTAMP        NOT NULL 
    ,PRIMARY KEY (id)
My ignite client:
public static void main(String[] args) {
        Ignition.setClientMode(true);

        try (Ignite ignite = Ignition.start("myconf.xml")) {

            try (IgniteCache<Long, Customer> cache = 
ignite.getOrCreateCache("customerCache")) {

                // Load cache with data from the database.
                System.out.println("@@@@ Load cache customerCache ...");
                cache.loadCache(null);
               
               // Ecriture de nouveaux Customer
               Customer customer=new Customer();
               for (int index=0;index<10;index++)  {
                   customer.setLogin("login"+index);
                   customer.setEmail("login"+index+"@test.com");
                   customer.setAge(22);
                   System.out.println("@@@@ write "+customer);
                   cache.query(new SqlFieldsQuery("INSERT INTO CUSTOMER 
(login,email,age) VALUES (?,?,?)")
                        .setArgs(
                            customer.getLogin()
                            ,customer.getEmail() 
                            ,customer.getAge()
                        )
                    );
               }
            }
            catch (Throwable exception) {
                exception.printStackTrace();
            }
        }
    }

My ignit conf (myconf.xml):  <property name="cacheConfiguration">
            <list>
                <bean 
class="org.apache.ignite.configuration.CacheConfiguration">
                
                    <property name="name" value="customerCache"></property>
                    
                    <!-- Enable readThrough-->
                    <property name="readThrough" value="true"></property>
                    <property name="writeThrough" value="true"></property>
    
                    <!-- Set cacheStoreFactory-->
                    <property name="cacheStoreFactory">
                        <bean class="javax.cache.configuration.FactoryBuilder" 
factory-method="factoryOf">
                            <constructor-arg 
value="com.govarch.poc.ignite.CustomerStore"></constructor-arg>
                        </bean>
                    </property>
                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" 
value="java.lang.Long"></property>
                                <property name="valueType" 
value="com.govarch.poc.ignite.Customer"></property>
                                <property name="fields">
                                    <map>
                                        <entry key="id" 
value="java.lang.Long"></entry>
                                        <entry key="login" 
value="java.lang.String"></entry>
                                        <entry key="firstname" 
value="java.lang.String"></entry>
                                        <entry key="lastname" 
value="java.lang.String"></entry>
                                        <entry key="phone" 
value="java.lang.String"></entry>
                                        <entry key="email" 
value="java.lang.String"></entry>
                                        <entry key="age" 
value="java.lang.Integer"></entry>
                                    </map>
                                </property>
                                <property name="indexes">
                                    <list>
                                        <bean 
class="org.apache.ignite.cache.QueryIndex">
                                            <constructor-arg value="id"/>
                                        </bean>
                                        <bean 
class="org.apache.ignite.cache.QueryIndex">
                                            <constructor-arg value="login"/>
                                        </bean>
                                    </list>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>
            </list>
        </property>
        
How o manage sequence with legacy database having auto increment id ?


Reply via email to