Java Persistence Frameworks for MongoDB

Post on 18-Oct-2014

8.023 views 2 download

description

 

Transcript of Java Persistence Frameworks for MongoDB

MongoDB Berlin 2013:

codecentric AG

MongoDB Berlin 2013:

Java Persistence Frameworks

Tobias.Trelle@codecentric.de / @

Frameworks for MongoDB

Tobias.Trelle@codecentric.de / @tobiastrelle

Tobias Trelle

- Senior IT Consultant @ codecentric@ codecentric(official

- Conference

- MongoDB Düsseldorf/Germany

codecentric AG

Düsseldorf/Germany

- AuthoringMongoDB

Senior IT Consultant codecentric AG codecentric AG

official 10gen partner)

Conference talks on MongoDB

MongoDB user groupDüsseldorf/GermanyDüsseldorf/Germany

Authoring a German book on MongoDB

Where have all my tables gone

ORM

long live ODM

codecentric AG

long live ODM

gone …

ORM is dead

ODMODM

Agenda

− MongoDB Java D− MongoDB Java D

− Spring Data MongoDB

− Morphia

codecentric AG

− Morphia

− Hibernate OGM

DriverDriver

Spring Data MongoDB

Use Case

codecentric AG

Mongo Java Driver

codecentric AG

Mongo Java Driver

MongoDB Drivers

− One wire protocol for all client

− A driver implementation per language

− Responsibilities:

− Converting language dependent data

codecentric AG

− Generating ObjectId for _id field

− Overview: http://www.mongodb.org/display/DOCS/Drivers

languages

language

data structures � � BSON

www.mongodb.org/display/DOCS/Drivers

MongoDB Java Driver

− One JAR w/o further dependencies

<dependency>

<groupId>org.mongodb</

<artifactId>mongo-java

<version>2.10.0</version

</dependency>

codecentric AG

− github: https://github.com/mongodb/mongo

ependencies:

</groupId>

java-driver</artifactId>

version>

github.com/mongodb/mongo-java-driver

Java Driver: Connect to MongoDB

import com.mongodb.MongoClient

// Default: localhost:27017// Default: localhost:27017

mongo = new MongoClient();

// Sharding: mongos server

mongo = new MongoClient("mongos01"

// Replica set

mongo = new MongoClient(Arrays.

codecentric AG

mongo = new MongoClient(Arrays.

new ServerAddress("replicant01"

new ServerAddress("replicant02"

new ServerAddress("replicant03"

));

MongoDB

com.mongodb.MongoClient;

"mongos01", 4711);

Arrays.asList(Arrays.asList(

"replicant01", 10001),

"replicant02", 10002),

"replicant03", 10003)

Java Driver: Database / Collection

import com.mongodb.DB

import com.mongodb.DBCollectionimport com.mongodb.DBCollection

DB db = mongo.getDB

DBCollection collection

codecentric AG

DBCollection collection

db.getCollection

Java Driver: Database / Collection

com.mongodb.DB;

com.mongodb.DBCollection;com.mongodb.DBCollection;

mongo.getDB("test");

collection = collection =

db.getCollection("foo");

Java Driver: Documents

import com.mongodb.BasicDBObject

import com.mongodb.DBObjectimport com.mongodb.DBObject

// insert document

DBObject doc = new

doc.put("date", new

doc.put("i", 42);

codecentric AG

doc.put("i", 42);

collection.insert(doc

com.mongodb.BasicDBObject;

com.mongodb.DBObject;com.mongodb.DBObject;

BasicDBObject();

new Date());

doc);

Java Driver: Queries

import com.mongodb.DBCursor

DBCursor cursor;

cursor = collection.find();

// documents w/ {i: 42}

cursor = collection.find(

codecentric AG

cursor = collection.find(

new BasicDBObject("i

document = cursor.next();

...

com.mongodb.DBCursor;

(); // all documents

( (

i", 42) );

();

Java Driver: Order Use Case

DB db = mongo.getDB("test");

DBCollection collection = db.getCollection("order"

DBObject order;

List<DBObject> items = new ArrayList<DBObject>();List<DBObject> items = new ArrayList<DBObject>();

DBObject item;

// order

order = new BasicDBObject();

order.put("date", new Date());

order.put("custInfo" , "Tobias Trelle");

order.put("items", items);

// items

item = new BasicDBObject();

item.put("quantity", 1);

item.put("price", 47.11);

item.put("desc", "Item #1");

codecentric AG

item.put("desc", "Item #1");

items.add(item);

item = new BasicDBObject();

item.put("quantity", 2);

item.put("price", 42.0);

item.put("desc", "Item #2");

items.add(item);

collection.insert(order);

Case

"order");

>();>();

Spring Data MongoDB

codecentric AG

MongoDBSpring Data MongoDBMongoDB

Spring Data MongoDB – Fact Sheet

Vendor VMware / SpringSourceVendor VMware / SpringSource

License Apache License

Documentation http://www.springsource.org/spring

Main Features • Repository Support• Object/Document• Templating

codecentric AG

Fact Sheet

SpringSourceSpringSource

License, Version 2.0

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

Repository SupportDocument Mapping

Spring Data

Common patterns for RDBMS and NoSQL

Spring Data

Spring Data

JPA

CrudRepository

JpaRepository

JPA

Spring Data

MongoDB

MongoRepository

MongoTemplate

Mongo Java Driver

codecentric AG

RDBMS MongoDB

JPA

JDBC

Mongo Java Driver

Quelle: http://www.infoq.com/articles/spring

NoSQL data stores

Spring Data

PagingAndSortingRepository

Spring Data

Neo4j

Spring Data

GraphRepository

Neo4jTemplate

Embedded REST

Neo4j …

http://www.infoq.com/articles/spring-data-intro

Spring Data MongoDB

Templating

− Resource abstraction− Resource abstraction

− Configure connections to mongod / mongos

− Collection lifecycle ( create, drop)

− Map/Reduce / Aggregation

Object Mapping

− Annotation based: @Document, @Field, @Index etc.

− Classes are mapped to collections, Java Objects

codecentric AG

Repository Support

− Queries are derived from methods signatures

− Geospatial Queries

mongos node(s)

, @Field, @Index etc.

, Java Objects to documents

signatures

Spring Data MongoDB Template

Configuration

<!-- Connection to MongoDB server --

<mongo:db-factory host="localhost" port<mongo:db-factory host="localhost" port

<!-- MongoDB Template -->

<bean id="mongoTemplate"

class="org.springframework.data.mongodb.core.MongoTemplate

<constructor-arg name="mongoDbFactory

</bean>

Usage

codecentric AG

Usage

@Autowired MongoTemplate template;

template.indexOps(Location.class).ensureIndex

new GeospatialIndex("position") );

Spring Data MongoDB Template

-->

port="27017" dbname="test" />port="27017" dbname="test" />

org.springframework.data.mongodb.core.MongoTemplate">

mongoDbFactory" ref="mongoDbFactory"/>

ensureIndex(

) );

Spring Data MongoDB: Object

public class Order {

@Id private String id;

private Date date;private Date date;

@Field("custInfo") private String

List<Item> items; ...

}

public class Item {

private int quantity;

codecentric AG

private double price;

@Field("desc") private String description

...

}

Object Mapping

String customerInfo;

description;

Spring Data MongoDB: Repository Support

public interface OrderRepository

MongoRepository<Order, String> {

List<Order> findByItemsQuantity

List<Order> findByItemsPriceGreaterThan

}

codecentric AG

}

Spring Data MongoDB: Repository Support

OrderRepository extends

<Order, String> {

findByItemsQuantity(int quantity);

findByItemsPriceGreaterThan(double price);

Spring Data MongoDB: Repository Support

− Main Concept:

use the signature of a method to derive the query (at runtime)

− Base Implementations / abstractions for

− CRUD operations

codecentric AG

− Paging

− Sorting

Spring Data MongoDB: Repository Support

use the signature of a method to derive the query (at runtime)

Base Implementations / abstractions for

Spring Data MongoDB: Additional

− Map/Reduce / Aggregation framework

− Index Management

−Support for GridFS

−Geopspatial indexes / queries

codecentric AG

−Geopspatial indexes / queries

−Optimistic Locking

Spring Data MongoDB: Additional Goodies

Map/Reduce / Aggregation framework

indexes / queriesindexes / queries

Hibernate

codecentric AG

Hibernate OGM

Hibernate OGM MongoDB –

Vendor JBoss / RedhatVendor JBoss / Redhat

License GNU LGPL, Version 2.1

Documentation http://www.hibernate.org/subprojects/ogm.html

Main Features • JPA API (Subset• JPQL Query Language

codecentric AG

Fact Sheet

, Version 2.1

http://www.hibernate.org/subprojects/ogm.html

Subset)Query Language

Hibernate OGM

− Implements JPA API (subset)− Implements JPA API (subset)

− JP-QL query are translated to native datastore queries

codecentric AG

− Supports Infinispan,

Implements JPA API (subset)Implements JPA API (subset)

QL query are translated to native

MongoDB, EhCache, MongoDB

Hibernate OGMArchitecture

codecentric AG

Source:

http://docs.jboss.org/hibernate/ogm/4.0/reference/en-US/html/ogm-architecture.html#d0e409

Hibernate OGM MongoDB: Configuration

<persistence version="2.0" …>

<persistence-unit name="primary"><persistence-unit name="primary">

<provider>org.hibernate.ogm.jpa.HibernateOgmPersistence

<class>hibernate.Order</class>

<class>hibernate.Item</class>

<properties>

<property name="hibernate.ogm.datastore.providervalue="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"

<property name="hibernate.ogm.mongodb.database

<property name="hibernate.ogm.mongodb.host

codecentric AG

<property name="hibernate.ogm.mongodb.host

<property name="hibernate.ogm.mongodb.port

</properties>

</persistence-unit>

</persistence>

Configuration

HibernateOgmPersistence</provider>

hibernate.ogm.datastore.provider""org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/>

hibernate.ogm.mongodb.database" value=„odm"/>

hibernate.ogm.mongodb.host" value=„localhost"/>hibernate.ogm.mongodb.host" value=„localhost"/>

hibernate.ogm.mongodb.port" value=„27017"/>

Hibernate OGM MongoDB: Object

@Entity

@NamedQuery(

name="byItemsQuantity",

query = "SELECT o FROM Order o JOIN o.items i

)

public class Order {

@GeneratedValue(generator = "uuid")

@GenericGenerator(name = "uuid", strategy = "uuid2"

@Id private String id;

private Date date;

codecentric AG

private Date date;

@Column(name = "custInfo") private String customerInfo

@ElementCollection

private List<Item> items;

Object Mapping

i WHERE i.quantity = :quantity"

"uuid2")

customerInfo;

Hibernate OGM MongoDB: Object

@Embeddable

public class Item {

private int quantity;

private double price;

@Column(name="desc") private String description

...

codecentric AG

Object Mapping

description;

Hibernate OGM: Summary

− Very early beta− Very early beta

− Only persist / merge / remove

− No query support (yet)

codecentric AG

− No query support (yet)

− Uses relational API

nly persist / merge / remove

o query support (yet)o query support (yet)

API

Hibernate OGM: OgmEntityManager

codecentric AG

OgmEntityManager

Morphia

codecentric AG

Morphia

Morphia – Fact Sheet

Developer Scott Hernandez, James GreenDeveloper Scott Hernandez, James Green

License Apache License

Documentation https://github.com/jmkgreen/morphia/wiki/Overview

Main Features • Object/Document• Custom Query API• DAO support

codecentric AG

Scott Hernandez, James GreenScott Hernandez, James Green

License, Version 2.0

https://github.com/jmkgreen/morphia/wiki/Overview

Document MappingCustom Query API

Morphia: Object Mapping

public class Order {

@Id private ObjectId id;@Id private ObjectId id;

private Date date;

@Property("custInfo") private String

@Embedded List<Item> items;

...

}

public class Item {

private int quantity;

codecentric AG

private int quantity;

private double price;

@Property("desc") private String description

...

}

String customerInfo;

description;

Morphia: Queries

public class OrderDao extends BasicDAO

List<Order> findByItemsQuantity(int

return

find( createQuery().filter("items.quantity

.asList();

}

List<Order> findByItemsPriceGreaterThan

return

codecentric AG

return

find( createQuery().field("items.price

.asList();

}

}

BasicDAO<Order, ObjectId> {

quantity) {

items.quantity", quantity))

findByItemsPriceGreaterThan(double price) {

items.price").greaterThan(price) )

Morphia: Custom query syntax

Morphia MongoMorphia Mongo

= $

!=, <> $

>, <, >=,<= $

in, nin $in, $

elem $

codecentric AG

elem $

… ….

syntax – why?

Mongo QueryMongo Query

$eq

$neq

$gt, $lt, $gte, $lte

$in, $nin

$elemMatch$elemMatch

….

Judge yourself …

Spring Data MongoDB

https://github.com/ttrelle/springhttps://github.com/ttrelle/spring

Hibernate OGM MongoDB

https://github.com/ttrelle/hibernate

Morphia

codecentric AG

Morphia

https://github.com/ttrelle/morphia

https://github.com/ttrelle/spring-data-exampleshttps://github.com/ttrelle/spring-data-examples

github.com/ttrelle/hibernate-ogm-examples

github.com/ttrelle/morphia-mongodb-examples

Which one should I use?

EnterpriseStandard

Hibernate OGM

Spring Data MongoDB

JPA

codecentric AG

JDBC

High Abstraction

CustomAPI

Spring Data MongoDB

Morphia

Low Abstraction

MongoDB Java Driver

MUG Düsseldorf

https://www.xing.com/net/mongodb-dus

German MongoDB User Groups

https://www.xing.com/net/mongodb-dus

@MongoDUS

MUG Frankfurt/Main

https://www.xing.com/net/mongodb-ffm

@MongoFFM

MUG München

codecentric AG

MUG München

http://www.meetup.com/Muenchen-MongoDB

@mongomuc

German MongoDB User Groups (MUGs)

MUG Berlin

http://www.meetup.com/MUGBerlin/http://www.meetup.com/MUGBerlin/

@MUGBerlin

Hamburg MUGhttps://www.xing.com/net/mugh

MongoDB-User-Group/

QUESTIONS?

Tobias Trelle

codecentric AGMerscheider Str. 142699 Solingen

tel +49 (0) 212.233628.47fax +49 (0) 212.233628.79mail Tobias.Trelle@codecentric.de

twitter @tobiastrelle

codecentric AG

www.codecentric.de

blog.codecentric.de/en/author/tobias-trelle

www.xing.com/net/mongodb-dus

trelle