• Save
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
Upcoming SlideShare
Loading in...5

BedCon 2013 - Java Persistenz-Frameworks für MongoDB






Total Views
Views on SlideShare
Embed Views



1 Embed 11

http://lanyrd.com 11



Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

BedCon 2013 - Java Persistenz-Frameworks für MongoDB BedCon 2013 - Java Persistenz-Frameworks für MongoDB Presentation Transcript

  • Java Persistenz-Frameworks für MongoDBTobias.Trelle@codecentric.de @tobiastrellecodecentric AG 1
  • Tobias Trelle - Senior IT Consultant @ codecentric AG (Düsseldorf) - Organisator MongoDB Usergruppe Düsseldorf - Autor MongoDB-Buch (dpunkt-Verlag)codecentric AG 2
  • Where have all my tables gone … ORM is dead long live ODMcodecentric AG 3
  • MongoDB? NoSQL-Datenbank / Open Source Dokumentenorientiert Hochperformant, horizontal skalierbar (scale-out) Replication & Sharding out-of-the-box Map/Reduce Geospatial Indexes / Queriescodecentric AG 4
  • Grundkonzept MongoDB-Server ServerRelationales DatabasePendant Aber … Flexibles Tabelle Collection Schema Zeile Document - Arrays Spalte Field - Rekursivcodecentric AG 5
  • Document{ title: „Praxisbuch Mongo“, version: 0.1, copies_sold: 0, authors: [ { name: „Uwe Seiler“, email: „uwe.seiler@codecentric.de“ }, { name: „Tobias Trelle“, email: „tobias.trelle@codecentric.de“} ]}codecentric AG 6
  • JSON vs. BSON{ hello: "MongoDB" }x18x00x00x00 x02 hellox00 x08x00x00x00MongoDBx00x00codecentric AG 7
  • CRUD = IFUR insert(…) find(…), findOne(…) update(…) remove()codecentric AG 8
  • Java Persistenz mit MongoDB MongoDB Java Driver Spring Data MongoDB Morphia Hibernate OGM Jongocodecentric AG 9
  • Use Casedb.order.find( {"items.quantity": ? } )codecentric AG 10
  • Mongo Java Drivercodecentric AG 11
  • MongoDB Drivers One wire protocol for all client languages A driver implementation per language Responsibilities: Converting language dependent data structures   BSON Generating ObjectId for _id field Overview: http://www.mongodb.org/display/DOCS/Driverscodecentric AG 12
  • MongoDB Java Driver One JAR w/o further dependencies: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.10.0</version> </dependency> github: https://github.com/mongodb/mongo-java-drivercodecentric AG 13
  • Java Driver: Connect to MongoDBimport com.mongodb.MongoClient;// Default: localhost:27017mongo = new MongoClient();// Sharding: mongos servermongo = new MongoClient("mongos01", 4711);// Replica setmongo = new MongoClient(Arrays.asList( new ServerAddress("replicant01", 10001), new ServerAddress("replicant02", 10002), new ServerAddress("replicant03", 10003) ));codecentric AG 14
  • Java Driver: Database / Collectionimport com.mongodb.DB;import com.mongodb.DBCollection;DB db = mongo.getDB("test");DBCollection collection = db.getCollection("foo");codecentric AG 15
  • Java Driver: Documentsimport com.mongodb.BasicDBObject;import com.mongodb.DBObject;// insert documentDBObject doc = new BasicDBObject();doc.put("date", new Date());doc.put("i", 42);collection.insert(doc);codecentric AG 16
  • Java Driver: Queriesimport com.mongodb.DBCursor;DBCursor cursor;cursor = collection.find(); // all documents// documents w/ {i: 42}cursor = collection.find( new BasicDBObject("i", 42) );document = cursor.next();...codecentric AG 17
  • Java Driver: Order Use CaseDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject order;List<DBObject> items = new ArrayList<DBObject>();DBObject item;// orderorder = new BasicDBObject();order.put("date", new Date());order.put("custInfo" , "Tobias Trelle");order.put("items", items);// itemsitem = new BasicDBObject();item.put("quantity", 1);item.put("price", 47.11);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);codecentric AG 18
  • Java Driver: Order Use CaseDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject query;DBObject document;DBCursor cursor;query = new BasicDBObject("items.quantity", 2);cursor = collection.find(query);while ( cursor.hasNext() ) { document = cursor.next(); println(document);}codecentric AG 19
  • Spring Data MongoDBcodecentric AG 20
  • Spring Data MongoDB – Fact Sheet Vendor VMware / SpringSource License Apache License, Version 2.0 Documentation http://www.springsource.org/spring-data/mongodb Main Features • Repository Support • Object/Document Mapping • Templatingcodecentric AG 21
  • Spring DataCommon patterns for RDBMS and NoSQL data stores Spring Data CrudRepository PagingAndSortingRepository Spring Data Spring Data Spring Data Spring Data JPA MongoDB Neo4j … JpaRepository MongoRepository GraphRepository MongoTemplate Neo4jTemplate Embedded REST JPA Mongo Java Driver JDBC RDBMS MongoDB Neo4j …Quelle: http://www.infoq.com/articles/spring-data-introcodecentric AG 22
  • Spring Data MongoDBTemplating Resource abstraction Configure connections to mongod / mongos node(s) Collection lifecycle ( create, drop) Map/Reduce / AggregationObject Mapping Annotation based: @Document, @Field, @Index etc. Classes are mapped to collections, Java Objects to documentsRepository Support Queries are derived from methods signatures Annotated Queriescodecentric AG 23
  • Spring Data MongoDB: Configuration<!-- Connection to MongoDB server --><mongo:db-factory host="localhost" port="27017" dbname="test" /><!-- MongoDB Template --><bean id="mongoTemplate„ class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/></bean><!-- Package w/ automagic repositories --><mongo:repositories base-package="mongodb" />codecentric AG 24
  • Spring Data MongoDB: Object Mappingpublic class Order { @Id private String id; private Date date; @Field("custInfo") private String customerInfo; List<Item> items; ...}public class Item { private int quantity; private double price; @Field("desc") private String description; ...}codecentric AG 26
  • Spring Data MongoDB: Repository Supportpublic interface OrderRepository extends MongoRepository<Order, String> { List<Order> findByItemsQuantity(int quantity); @Query("{ "items.quantity": ?0 }") List<Order> findWithQuery(int quantity);}codecentric AG 27
  • Spring Data MongoDB: Additional Goodies Map/Reduce / Aggregation framework Index Management Support for GridFS Geopspatial indexes / queries Optimistic Lockingcodecentric AG 28
  • Hibernate OGMcodecentric AG 29
  • Hibernate OGM MongoDB – Fact Sheet Vendor JBoss / Redhat License GNU LGPL, Version 2.1 Documentation http://www.hibernate.org/subprojects/ogm.html Main Features • JPA API (Subset) • JPQL Query Languagecodecentric AG 30
  • Hibernate OGM Implements JPA API (subset) JP-QL query are translated to native datastore queries Supports Infinispan, EhCache, MongoDBcodecentric AG 31
  • Hibernate OGMArchitectureSource:http://docs.jboss.org/hibernate/ogm/4.0/reference/en- US/html/ogm-architecture.html#d0e409codecentric AG 32
  • Hibernate OGM MongoDB: Configuration<persistence version="2.0" …> <persistence-unit name="primary"> <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> <class>hibernate.Order</class> <class>hibernate.Item</class> <properties> <property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> <property name="hibernate.ogm.mongodb.database" value=„odm"/> <property name="hibernate.ogm.mongodb.host" value=„localhost"/> <property name="hibernate.ogm.mongodb.port" value=„27017"/> </properties> </persistence-unit></persistence>codecentric AG 33
  • Hibernate OGM MongoDB: Object Mapping@Entity@NamedQuery( name="byItemsQuantity", query = "SELECT o FROM Order o JOIN o.items i WHERE i.quantity = :quantity" )public class Order { @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") @Id private String id; private Date date; @Column(name = "custInfo") private String customerInfo; @ElementCollection private List<Item> items;codecentric AG 34
  • Hibernate OGM MongoDB: Object Mapping@Embeddablepublic class Item { private int quantity; private double price; @Column(name="desc") private String description; ...codecentric AG 35
  • Hibernate OGM: Summary Very early beta Only persist / merge / remove No query support (yet) Uses relational APIcodecentric AG 36
  • Hibernate OGM: OgmEntityManagercodecentric AG 37
  • Morphiacodecentric AG 38
  • Morphia – Fact Sheet Developer Scott Hernandez, James Green License Apache License, Version 2.0 Documentation https://github.com/jmkgreen/morphia/wiki/Overview Main Features • Object/Document Mapping • Custom Query API • DAO supportcodecentric AG 39
  • Morphia: Object Mappingpublic class Order { @Id private ObjectId id; private Date date; @Property("custInfo") private String customerInfo; @Embedded List<Item> items; ...}public class Item { private int quantity; private double price; @Property("desc") private String description; ...}codecentric AG 40
  • Morphia: Queriespublic class OrderDao extends BasicDAO<Order, ObjectId> { List<Order> findByItemsQuantity(int quantity) { return find( createQuery().filter("items.quantity", quantity)) .asList(); } List<Order> findByItemsPriceGreaterThan(double price) { return find( createQuery().field("items.price").greaterThan(price) ) .asList(); } …}codecentric AG 41
  • Morphia: Custom query syntax – why? Morphia Mongo Query = $eq !=, <> $neq >, <, >=,<= $gt, $lt, $gte, $lte in, nin $in, $nin elem $elemMatch … ….codecentric AG 42
  • Jongocodecentric AG 43
  • Jongo – Fact Sheet Developer Benoît Guérout, Yves Amsellem License Apache License, Version 2.0 Documentation http://jongo.org/ Main Features • Object/Document Mapping • Custom Query APIcodecentric AG 44
  • Jongo: Object Mappingpublic class Order { private ObjectId id; private Date date; @JsonProperty("custInfo") private String customerInfo; List<Item> items;… }public class Item { private int quantity; private double price; @JsonProperty("desc") private String description; …}codecentric AG 45
  • Jongo: Queries// Java driver APIMongoClient mc = new MongoClient();DB db = mc.getDB("odm_jongo");// Jongo API entry pointJongo jongo = new Jongo(db);MongoCollection orders = jongo.getCollection("order");// no DAO neededIterable<Order> result = orders.find("{"items.quantity": #}", 2).as(Order.class);// supports projectionIterable<X> result = orders.find().fields("{_id:0, date:1, custInfo:1}").as(X.class);codecentric AG 46
  • Judge yourself …Spring Data MongoDBhttps://github.com/ttrelle/spring-data-examplesHibernate OGM MongoDBhttps://github.com/ttrelle/hibernate-ogm-examplesJongohttps://github.com/ttrelle/jongo-examplesMorphiahttps://github.com/ttrelle/morphia-mongodb-examplescodecentric AG 47
  • Summary ODM Queries AnnotationsJava Driver -- Nested BasicDBObject‘sSpring Data MongoDB Custom Interface w/ - derived queries - JSON queriesHibernate OGM JPA JPQL: @Named(Native)Query + EntityManagerJongo Jackson JSON queries via collection wrapperMorphia Custom BasicDAO super class w/ 2 flavours of fluent APIcodecentric AG 48
  • Which one should I use? - Ready for production Spring Data - Active community MongoDBJPA Hibernate OGM -Too early to judge Dead - API mismatch Morphia The „better“ driver JongoJDBC MongoDB Java Driver - Ready for production - Supported by 10gen MongoDBcodecentric AG 49
  • MUG DüsseldorfMongoDB User Group Düsseldorfhttps://www.xing.com/net/mongodb-dus@MongoDUScodecentric AG 50
  • QUESTIONS?Tobias Trellecodecentric AGMerscheider Str. 142699 Solingentel +49 (0) 212.233628.47fax +49 (0) 212.233628.79mail Tobias.Trelle@codecentric.detwitter @tobiastrellewww.codecentric.deblog.codecentric.de/en/author/tobias-trellewww.xing.com/net/mongodb-duscodecentric AG 51