The example below shows the various config and code required to use Spring Data Repository with GemFire7. It is assumed we have a GemFire distributed system up and running with some department and employee data. For this example we will connect as a client proxy where all requests go to the server side for processing.
client.xml - client cache file for access to the remote servers
<!DOCTYPE client-cache PUBLIC
"-//GemStone Systems, Inc.//GemFire Declarative Caching 7//EN"
"http://www.gemstone.com/dtd/cache7_0.dtd">
<client-cache>
<!-- No cache storage in the client region because of the PROXY client region shortcut setting. -->
<region name="departments">
<region-attributes refid="PROXY" pool-name="gfPool"/>
</region>
<region name="employees">
<region-attributes refid="PROXY" pool-name="gfPool" />
</region>
</client-cache>
application-context.xml - spring application context file using spring gemfire. It's here where we make a connection to GemFire through a locator to load balance between the servers.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gfe="http://www.springframework.org/schema/gemfire"
xmlns:gfe-data="http://www.springframework.org/schema/data/gemfire"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire-1.2.xsd
http://www.springframework.org/schema/data/gemfire http://www.springframework.org/schema/data/gemfire/spring-data-gemfire-1.2.xsd">
<gfe:client-cache id="client-cache" cache-xml-location="classpath:client.xml" pool-name="gfPool"/>
<gfe:pool id="gfPool" max-connections="10">
<gfe:locator host="localhost" port="10334"/>
</gfe:pool>
<gfe:lookup-region id="departments" name="departments" cache-ref="client-cache"/>
<gfe:lookup-region id="employees" name="employees" cache-ref="client-cache"/>
<gfe-data:repositories base-package="vmware.au.se.gf7.deptemp.repos" />
</beans>
Department.java - domain object with spring data repository annotation referencing "departments" region in gemFire
package vmware.au.se.gf7.deptemp.beans;
import java.io.Serializable;
import java.util.Properties;
import org.springframework.data.annotation.Id;
import org.springframework.data.gemfire.mapping.Region;
import com.gemstone.gemfire.cache.Declarable;
@Region("departments")
public class Department implements Declarable, Serializable
{
private static final long serialVersionUID = -9097335119586059309L;
@Id
private int deptno;
private String name;
public void init(Properties props)
{
// TODO Auto-generated method stub
this.deptno = Integer.parseInt(props.getProperty("deptno"));
this.name = props.getProperty("name");
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Department [deptno=" + deptno + ", name=" + name + "]";
}
}
Employee.java - domain object with spring data repository annotation referencing "employees" region in GemFire
package vmware.au.se.gf7.deptemp.beans;
import java.io.Serializable;
import java.util.Properties;
import org.springframework.data.annotation.Id;
import org.springframework.data.gemfire.mapping.Region;
import com.gemstone.gemfire.cache.Declarable;
@Region("employees")
public class Employee implements Declarable, Serializable
{
private static final long serialVersionUID = -8229531542107983344L;
@Id
private int empno;
private String name;
private String job;
private int deptno;
public void init(Properties props)
{
// TODO Auto-generated method stub
this.empno = Integer.parseInt(props.getProperty("empno"));
this.name = props.getProperty("name");
this.job = props.getProperty("job");
this.deptno = Integer.parseInt(props.getProperty("deptno"));
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
@Override
public String toString() {
return "Employee [empno=" + empno + ", name=" + name + ", job=" + job
+ ", deptno=" + deptno + "]";
}
}
At this point we create two repositories as shown below.
DeptRepository.java
package vmware.au.se.gf7.deptemp.repos;
import java.util.Collection;
import org.springframework.data.gemfire.repository.Query;
import org.springframework.data.repository.CrudRepository;
import vmware.au.se.gf7.deptemp.beans.Department;
public interface DeptRepository extends CrudRepository<Department, String>
{
Department findByName(String name);
@Query("SELECT * FROM /departments")
Collection<Department> myFindAll();
}
EmpRepository.java
package vmware.au.se.gf7.deptemp.repos;
import java.util.Collection;
import org.springframework.data.gemfire.repository.Query;
import org.springframework.data.repository.CrudRepository;
import vmware.au.se.gf7.deptemp.beans.Employee;
public interface EmpRepository extends CrudRepository<Employee, String>
{
@Query("SELECT * FROM /employees where deptno = $1")
Collection<Employee> empsInDeptno(int deptno);
@Query("SELECT * FROM /employees")
Collection<Employee> myFindAll();
}
Finally we have a Test client as follows.
package spring.gemfire.repository.test;
import java.util.Collection;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import vmware.au.se.gf7.deptemp.beans.Department;
import vmware.au.se.gf7.deptemp.beans.Employee;
import vmware.au.se.gf7.deptemp.repos.DeptRepository;
import vmware.au.se.gf7.deptemp.repos.EmpRepository;
public class Test
{
private ConfigurableApplicationContext ctx = null;
public Test()
{
ctx = new ClassPathXmlApplicationContext("application-context.xml");
}
public void run()
{
DeptRepository deptRepos = (DeptRepository) ctx.getBean(DeptRepository.class);
// get quick size
System.out.println("** Size of dept repository **");
System.out.println("Size = " + deptRepos.count());
// call findOne crud method by key
System.out.println("** calling deptRepos.findOne(\"20\") **");
Department dept = (Department) deptRepos.findOne("20");
System.out.println(dept);
// call findOne crud method for an attribute
System.out.println("** calling deptRepos.findByName(\"ACCOUNTING\") **");
Department dept2 = (Department) deptRepos.findByName("ACCOUNTING");
System.out.println(dept2);
// call my own findAll
Collection<Department> deps = (Collection<Department>) deptRepos.myFindAll();
System.out.println("\n** All Departments using -> deptRepos.myFindAll()");
System.out.println("Defined as : @Query(\"SELECT * FROM /departments\") ");
System.out.println("Collection<Department> myFindAll(); ** ");
for (Department d: deps)
{
System.out.println(d.toString());
}
EmpRepository empRepos = (EmpRepository) ctx.getBean(EmpRepository.class);
// get quick size
System.out.println("** Size of emp repository **");
System.out.println("Size = " + empRepos.count());
Collection<Employee> emps = empRepos.empsInDeptno(40);
System.out.println("\n ** All Employees in dept 40 using -> Collection<Employee> empsInDeptno(int deptno) **");
for (Employee e: emps)
{
System.out.println(e.toString());
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Test t = new Test();
t.run();
System.out.println("all done..");
}
}
Output is as follows
[info 2012/11/22 16:39:03.626 EST tid=0xf] AutoConnectionSource discovered new locators [192-168-1-3.tpgi.com.au/192.168.1.3:10334]
[config 2012/11/22 16:39:03.628 EST tid=0x10] Updating membership port. Port changed from 0 to 59,207.
** Size of dept repository **
Size = 4
** calling deptRepos.findOne("20") **
Department [deptno=20, name=RESEARCH]
** calling deptRepos.findByName("ACCOUNTING") **
Department [deptno=10, name=ACCOUNTING]
** All Departments using -> deptRepos.myFindAll()
Defined as : @Query("SELECT * FROM /departments")
Collection myFindAll(); **
Department [deptno=30, name=SALES]
Department [deptno=40, name=OPERATIONS]
Department [deptno=10, name=ACCOUNTING]
Department [deptno=20, name=RESEARCH]
** Size of emp repository **
Size = 13
** All Employees in dept 40 using -> Collection empsInDeptno(int deptno) **
Employee [empno=7380, name=BLACK, job=CLERK, deptno=40]
Employee [empno=7381, name=BROWN, job=SALESMAN, deptno=40]
Employee [empno=7373, name=SIENA, job=CLERK, deptno=40]
all done..
For more information see the link below.
http://static.springsource.org/spring-gemfire/docs/current/reference/html/gemfire-repositories.html