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 ?