How to Use NoSQL
in Enterprise Java Applications




Patrick Baumgartner

NoSQL Roadshow | Basel | 30.08.2012
Agenda

•   Speaker Profile
•   New Demands on Data Access
•   New Types of Data Stores
•   Integrating NoSQL Data Stores
•   Spring Data Overview
•   Example with MongoDB
•   Example with Neo4j
•   Q&A




                                    2
Speaker Profile

Patrick Baumgartner
•   Senior Software Consultant | Partner
•   VMware/SpringSource Certified Instructor (Spring Trainer)
•   Spring Framework, OSGi & agile engineering practices
•   Co-author of „OSGi für Praktiker“ (Hanser)


Swiftmind GmbH http://www.swiftmind.com
• Enterprise Java, Spring & OSGi consulting
• Spring & OSGi workshops & trainings
• Agile engineering practices workshops


                                                                3
New Demands on Data Access

                  • Structured and
                    unstructured data
                  • Massive amounts of data
                  • Inexpensive horizontal
                    scaling
                  • Apps and data in the
                    cloud
                  • Social network features
                  • …




                                              4
New Types of Data Stores




                           5
Integrating NoSQL Data Stores #1
We are not architects!




                            http://www.flickr.com/photos/sakeeb/4087246274


                                                                        6
Integrating NoSQL Data Stores #2
Don’t re-invent the wheel!




                             http://www.flickr.com/photos/dmott9/5921728819


                                                                         7
Integrating NoSQL Data Stores #3
Let’s use Spring!




                              http://www.springsource.org/spring-data


                                                                   8
Spring Data

• Same goals as the Spring Framework
   – Productivity improvement
   – Programming model consistency
   – Portability

• Umbrella for subprojects, specific to a given database
• Mapping support for Java domain objects



• http://www.springsource.org/spring-data
• http://github.com/SpringSource/spring-data-XXX

                                                           9
Spring Data – Overview #1

  Relational Databases
  • JPA
  • JDBC Extensions

  Big Data
  • Apache Hadoop

  Data Grid
  • GemFire

  HTTP
  • REST

                            10
Spring Data – Overview #2

  Key Value Stores
  • Redis

  Document Stores
  • Mongo DB

  Graph Databases
  • Neo4J

  Column Stores
  • HBase

  Common Infrastructure
  • Commons

                            11
Spring Data – Key Features

• Low level data access API abstraction
   – MongoTemplate, RiakTemplate, Neo4jTemplate
   – Exception translation
   – Transaction management
• Object Mapping (Java to data store)
• Generic Repository Support
   – Basic CRUD, dynamic finders, pagination and sorting
• Spring namespaces
• Cross Store Persistence Programming Model
   – @Entity, @Document, @NodeEntity



                                                           12
Spring Data MongoDB – Example




                                13
Documents



            Stored JSON:
            { "_id" : ObjectId("4f9886290364b533b3acd4ce"),
              "_class" : "com.acme.hello.domain.Person",
              "name" : "Bob",
              "age" : 33
            }




                                                         14
Spring Data MongoDB – Document

@Document
public class Person {
  @Id
                         Stored JSON:
  private int id;        { "_id" : ObjectId("4f9886290364b533b3acd4ce"),
                           "_class" : "com.example.Person",
  private String name;     "name" : "Bob",
  private int age;         "age" : 33
                         }
  // getters/setters…
}




                                                                      15
Spring Data MongoDB – Configuration




                                      16
Spring Data MongoDB – Repository

@Repository
public class MongoPersonRepository implements BaseRepository<Person> {


    @Autowired
    MongoOperations mongoTemplate;


    Person createPerson(String name, int age){
        if(!mongoTemplate.collectionExists(Person.class)){
            mongoTemplate.createCollection(Person.class);
        }
        Person p = new Person(name, age);
        mongoTemplate.insert(p)
        return p;
    }


    ...
}



                                                                         17
Spring Data Neo4j – Example




                              18
Graph




        19
Spring Data Neo4j (SDN)

•   POJOs mapped as nodes or relationships – type safe
•   Works directly Database, typically embedded mode
•   Data is fetched very fast and lazy
•   Stores everything within a @Transaction
•   Uses heavily AspectJ magic to enhance the POJOs
•   …




                                                         20
Spring Data Neo4j – Entity

@NodeEntity
                                 Node
public class Person {
  private String name;
  private int age;             _type_: com.example.Person
                               name: "Alice"
  // getters/setters…          age: 42

}

Person alice = new Person();
alice.setName("Alice");
alice.setAge(42);
alice.persist();

                                                            21
Spring Data Neo4j – NodeEntity

@NodeEntity
public class Person {
  private String name;
  private int yearOfBirth;
  @RelatedTo(type = "KNOWS", direction = Direction.OUTGOING)
  private Set<Person> knownPersons;

 public void knows(Person p) {
   knownPersons.add(p);
 }
 public Set<Person> getFriends() {                   KNOWS
   return knownPersons;                   Alice                    Bob
 }
}
Person alice = ...;
alice.knows(bob);
alice.knows(carol);                          KNOWS
                                                               Carol


                                                                         22
Spring Data Neo4j – Relationship

@RelationshipEntity
public class Knows {
  private int sinceYear;
  public Knows since(int year) {
    this.sinceYear = year;
    return this;
  }
}

@NodeEntity
public class Person {
  public Known knows(Person p) {
    return this.relateTo(p, Knows.class, "KNOWS");
  }
}
Person alice = ...;
Person bob ...;                                      KNOWS
alice.knows(bob).since(2012);         Alice                        Bob
                                                     since: 2012

                                                                     23
Spring Data Neo4j – Repository

public interface PersonRepository extends
GraphRepository<Person> {
    @Query("start person = {0} match ... return ...")
    Iterable<Product> getOwnedServices(Person person);
    Iterable<Person> findByName(String name);
    Iterable<Person> findByNameLike(String name);
}


@Autowired
PersonRepository personRepository;
Person alice = personRepository.findByName("Alice");



                                                         24
Spring Data Neo4j – Querying

• Several possibilities implemented to query the graph
   – Neo4j API
   – Traversal descriptions
   – Graph algorithms
   – Index queries
   – Cypher queries




                                                         25
Give it a try!
Use a data model which really matches to your data …




                                           http://www.flickr.com/photos/juniorvelo/3267647833


                                                                                         26
05.09.2012 /ch/open Workshop-Tage
NoSQL für Java Enterprise Anwendungen mit Spring Data




                                         4th – 6th September



                                          http://www.flickr.com/photos/4nitsirk/5211251578


                                                                                      27
Q&A




Patrick Baumgartner
patrick.baumgartner [at] swiftmind [dot] com
http://www.swiftmind.com http://www.twitter.com/patbaumgartner


                                                            28

How to use NoSQL in Enterprise Java Applications - NoSQL Roadshow Basel

  • 1.
    How to UseNoSQL in Enterprise Java Applications Patrick Baumgartner NoSQL Roadshow | Basel | 30.08.2012
  • 2.
    Agenda • Speaker Profile • New Demands on Data Access • New Types of Data Stores • Integrating NoSQL Data Stores • Spring Data Overview • Example with MongoDB • Example with Neo4j • Q&A 2
  • 3.
    Speaker Profile Patrick Baumgartner • Senior Software Consultant | Partner • VMware/SpringSource Certified Instructor (Spring Trainer) • Spring Framework, OSGi & agile engineering practices • Co-author of „OSGi für Praktiker“ (Hanser) Swiftmind GmbH http://www.swiftmind.com • Enterprise Java, Spring & OSGi consulting • Spring & OSGi workshops & trainings • Agile engineering practices workshops 3
  • 4.
    New Demands onData Access • Structured and unstructured data • Massive amounts of data • Inexpensive horizontal scaling • Apps and data in the cloud • Social network features • … 4
  • 5.
    New Types ofData Stores 5
  • 6.
    Integrating NoSQL DataStores #1 We are not architects! http://www.flickr.com/photos/sakeeb/4087246274 6
  • 7.
    Integrating NoSQL DataStores #2 Don’t re-invent the wheel! http://www.flickr.com/photos/dmott9/5921728819 7
  • 8.
    Integrating NoSQL DataStores #3 Let’s use Spring! http://www.springsource.org/spring-data 8
  • 9.
    Spring Data • Samegoals as the Spring Framework – Productivity improvement – Programming model consistency – Portability • Umbrella for subprojects, specific to a given database • Mapping support for Java domain objects • http://www.springsource.org/spring-data • http://github.com/SpringSource/spring-data-XXX 9
  • 10.
    Spring Data –Overview #1 Relational Databases • JPA • JDBC Extensions Big Data • Apache Hadoop Data Grid • GemFire HTTP • REST 10
  • 11.
    Spring Data –Overview #2 Key Value Stores • Redis Document Stores • Mongo DB Graph Databases • Neo4J Column Stores • HBase Common Infrastructure • Commons 11
  • 12.
    Spring Data –Key Features • Low level data access API abstraction – MongoTemplate, RiakTemplate, Neo4jTemplate – Exception translation – Transaction management • Object Mapping (Java to data store) • Generic Repository Support – Basic CRUD, dynamic finders, pagination and sorting • Spring namespaces • Cross Store Persistence Programming Model – @Entity, @Document, @NodeEntity 12
  • 13.
    Spring Data MongoDB– Example 13
  • 14.
    Documents Stored JSON: { "_id" : ObjectId("4f9886290364b533b3acd4ce"), "_class" : "com.acme.hello.domain.Person", "name" : "Bob", "age" : 33 } 14
  • 15.
    Spring Data MongoDB– Document @Document public class Person { @Id Stored JSON: private int id; { "_id" : ObjectId("4f9886290364b533b3acd4ce"), "_class" : "com.example.Person", private String name; "name" : "Bob", private int age; "age" : 33 } // getters/setters… } 15
  • 16.
    Spring Data MongoDB– Configuration 16
  • 17.
    Spring Data MongoDB– Repository @Repository public class MongoPersonRepository implements BaseRepository<Person> { @Autowired MongoOperations mongoTemplate; Person createPerson(String name, int age){ if(!mongoTemplate.collectionExists(Person.class)){ mongoTemplate.createCollection(Person.class); } Person p = new Person(name, age); mongoTemplate.insert(p) return p; } ... } 17
  • 18.
    Spring Data Neo4j– Example 18
  • 19.
  • 20.
    Spring Data Neo4j(SDN) • POJOs mapped as nodes or relationships – type safe • Works directly Database, typically embedded mode • Data is fetched very fast and lazy • Stores everything within a @Transaction • Uses heavily AspectJ magic to enhance the POJOs • … 20
  • 21.
    Spring Data Neo4j– Entity @NodeEntity Node public class Person { private String name; private int age; _type_: com.example.Person name: "Alice" // getters/setters… age: 42 } Person alice = new Person(); alice.setName("Alice"); alice.setAge(42); alice.persist(); 21
  • 22.
    Spring Data Neo4j– NodeEntity @NodeEntity public class Person { private String name; private int yearOfBirth; @RelatedTo(type = "KNOWS", direction = Direction.OUTGOING) private Set<Person> knownPersons; public void knows(Person p) { knownPersons.add(p); } public Set<Person> getFriends() { KNOWS return knownPersons; Alice Bob } } Person alice = ...; alice.knows(bob); alice.knows(carol); KNOWS Carol 22
  • 23.
    Spring Data Neo4j– Relationship @RelationshipEntity public class Knows { private int sinceYear; public Knows since(int year) { this.sinceYear = year; return this; } } @NodeEntity public class Person { public Known knows(Person p) { return this.relateTo(p, Knows.class, "KNOWS"); } } Person alice = ...; Person bob ...; KNOWS alice.knows(bob).since(2012); Alice Bob since: 2012 23
  • 24.
    Spring Data Neo4j– Repository public interface PersonRepository extends GraphRepository<Person> { @Query("start person = {0} match ... return ...") Iterable<Product> getOwnedServices(Person person); Iterable<Person> findByName(String name); Iterable<Person> findByNameLike(String name); } @Autowired PersonRepository personRepository; Person alice = personRepository.findByName("Alice"); 24
  • 25.
    Spring Data Neo4j– Querying • Several possibilities implemented to query the graph – Neo4j API – Traversal descriptions – Graph algorithms – Index queries – Cypher queries 25
  • 26.
    Give it atry! Use a data model which really matches to your data … http://www.flickr.com/photos/juniorvelo/3267647833 26
  • 27.
    05.09.2012 /ch/open Workshop-Tage NoSQLfür Java Enterprise Anwendungen mit Spring Data 4th – 6th September http://www.flickr.com/photos/4nitsirk/5211251578 27
  • 28.
    Q&A Patrick Baumgartner patrick.baumgartner [at]swiftmind [dot] com http://www.swiftmind.com http://www.twitter.com/patbaumgartner 28

Editor's Notes

  • #25 Spring Data repositories can be composed with interfacesThe implementation is magically provided by Spring Data