/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.examples.datagrid.store.hibernate;
import java.util.List;
import java.util.UUID;
import javax.cache.integration.CacheLoaderException;
import javax.cache.integration.CacheWriterException;
import org.apache.ignite.cache.store.CacheStore;
import org.apache.ignite.cache.store.CacheStoreAdapter;
import org.apache.ignite.cache.store.CacheStoreSession;
import org.apache.ignite.examples.model.Person;
import org.apache.ignite.lang.IgniteBiInClosure;
import org.apache.ignite.resources.CacheStoreSessionResource;
import org.hibernate.HibernateException;
import org.hibernate.Session;
/**
* Example of {@link CacheStore} implementation that uses Hibernate
* and deals with maps {@link UUID} to {@link Person}.
*/
public class CacheHibernatePersonStore extends CacheStoreAdapter<Long, Person> {
/** Auto-injected store session. */
@CacheStoreSessionResource
private CacheStoreSession ses;
/** {@inheritDoc} */
@Override public Person load(Long key) {
System.out.println(">>> Store load [key=" + key + ']');
Session hibSes = ses.attachment();
try {
return (Person)hibSes.get(Person.class, key);
}
catch (HibernateException e) {
throw new CacheLoaderException("Failed to load value from cache store [key=" + key + ']', e);
}
}
/** {@inheritDoc} */
@Override public void write(javax.cache.Cache.Entry<? extends Long, ? extends Person> entry) {
Long key = entry.getKey();
Person val = entry.getValue();
System.out.println(">>> Store write [key=" + key + ", val=" + val + ']');
Session hibSes = ses.attachment();
try {
hibSes.saveOrUpdate(val);
}
catch (HibernateException e) {
throw new CacheWriterException("Failed to put value to cache store [key=" + key + ", val" + val + "]", e);
}
}
/** {@inheritDoc} */
@SuppressWarnings({"JpaQueryApiInspection"})
@Override public void delete(Object key) {
System.out.println(">>> Store delete [key=" + key + ']');
Session hibSes = ses.attachment();
try {
hibSes.createQuery("delete " + Person.class.getSimpleName() + " where key = :key").
setParameter("key", key).
executeUpdate();
}
catch (HibernateException e) {
throw new CacheWriterException("Failed to remove value from cache store [key=" + key + ']', e);
}
}
/** {@inheritDoc} */
@Override public void loadCache(IgniteBiInClosure<Long, Person> clo, Object... args) {
if (args == null || args.length == 0 || args[0] == null)
throw new CacheLoaderException("Expected entry count parameter is not provided.");
final int entryCnt = (Integer)args[0];
Session hibSes = ses.attachment();
try {
int cnt = 0;
List list = hibSes.createCriteria(Person.class).
setMaxResults(entryCnt).
list();
if (list != null) {
for (Object obj : list) {
Person person = (Person)obj;
clo.apply(person.id, person);
cnt++;
}
}
System.out.println(">>> Loaded " + cnt + " values into cache.");
}
catch (HibernateException e) {
throw new CacheLoaderException("Failed to load values from cache store.", e);
}
}
}