Java Persistence Frameworks for MongoDB

40
MongoDB Berlin 2013: codecentric AG MongoDB Berlin 2013: Java Persistence Framew Tobias.Trelle@codecentric works for MongoDB c.de / @tobiastrelle
  • date post

    18-Oct-2014
  • Category

    Documents

  • view

    8.023
  • download

    2

description

 

Transcript of Java Persistence Frameworks for MongoDB

Page 1: Java Persistence Frameworks for MongoDB

MongoDB Berlin 2013:

codecentric AG

MongoDB Berlin 2013:

Java Persistence Frameworks

[email protected] / @

Frameworks for MongoDB

[email protected] / @tobiastrelle

Page 2: Java Persistence Frameworks for MongoDB

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

Page 3: Java Persistence Frameworks for MongoDB

Where have all my tables gone

ORM

long live ODM

codecentric AG

long live ODM

gone …

ORM is dead

ODMODM

Page 4: Java Persistence Frameworks for MongoDB

Agenda

− MongoDB Java D− MongoDB Java D

− Spring Data MongoDB

− Morphia

codecentric AG

− Morphia

− Hibernate OGM

DriverDriver

Spring Data MongoDB

Page 5: Java Persistence Frameworks for MongoDB

Use Case

codecentric AG

Page 6: Java Persistence Frameworks for MongoDB

Mongo Java Driver

codecentric AG

Mongo Java Driver

Page 7: Java Persistence Frameworks for MongoDB

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

Page 8: Java Persistence Frameworks for MongoDB

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

Page 9: Java Persistence Frameworks for MongoDB

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)

Page 10: Java Persistence Frameworks for MongoDB

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");

Page 11: Java Persistence Frameworks for MongoDB

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);

Page 12: Java Persistence Frameworks for MongoDB

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) );

();

Page 13: Java Persistence Frameworks for MongoDB

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");

>();>();

Page 14: Java Persistence Frameworks for MongoDB

Spring Data MongoDB

codecentric AG

MongoDBSpring Data MongoDBMongoDB

Page 15: Java Persistence Frameworks for MongoDB

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

Page 16: Java Persistence Frameworks for MongoDB

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

Page 17: Java Persistence Frameworks for MongoDB

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

Page 18: Java Persistence Frameworks for MongoDB

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(

) );

Page 19: Java Persistence Frameworks for MongoDB

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;

Page 20: Java Persistence Frameworks for MongoDB

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);

Page 21: Java Persistence Frameworks for MongoDB

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

Page 22: Java Persistence Frameworks for MongoDB

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

Page 23: Java Persistence Frameworks for MongoDB

Hibernate

codecentric AG

Hibernate OGM

Page 24: Java Persistence Frameworks for MongoDB

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

Page 25: Java Persistence Frameworks for MongoDB

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

Page 26: Java Persistence Frameworks for MongoDB

Hibernate OGMArchitecture

codecentric AG

Source:

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

Page 27: Java Persistence Frameworks for MongoDB

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"/>

Page 28: Java Persistence Frameworks for MongoDB

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;

Page 29: Java Persistence Frameworks for MongoDB

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;

Page 30: Java Persistence Frameworks for MongoDB

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

Page 31: Java Persistence Frameworks for MongoDB

Hibernate OGM: OgmEntityManager

codecentric AG

OgmEntityManager

Page 32: Java Persistence Frameworks for MongoDB

Morphia

codecentric AG

Morphia

Page 33: Java Persistence Frameworks for MongoDB

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

Page 34: Java Persistence Frameworks for MongoDB

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;

Page 35: Java Persistence Frameworks for MongoDB

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) )

Page 36: Java Persistence Frameworks for MongoDB

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

….

Page 37: Java Persistence Frameworks for MongoDB

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

Page 38: Java Persistence Frameworks for MongoDB

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

Page 39: Java Persistence Frameworks for MongoDB

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/

Page 40: Java Persistence Frameworks for MongoDB

QUESTIONS?

Tobias Trelle

codecentric AGMerscheider Str. 142699 Solingen

tel +49 (0) 212.233628.47fax +49 (0) 212.233628.79mail [email protected]

twitter @tobiastrelle

codecentric AG

www.codecentric.de

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

www.xing.com/net/mongodb-dus

trelle