Post on 18-Oct-2014
description
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