Your SlideShare is downloading. ×
Java Persistenz-Frameworks für MongoDBTobias.Trelle@codecentric.de @tobiastrellecodecentric AG      1
Tobias Trelle                 - Senior IT Consultant @                  codecentric AG (Düsseldorf)                 - Orga...
Where have all my tables gone …                 ORM is dead                 long live   ODMcodecentric AG          3
MongoDB?      NoSQL-Datenbank / Open Source      Dokumentenorientiert      Hochperformant, horizontal skalierbar (scale-ou...
Grundkonzept MongoDB-Server                               ServerRelationales                              DatabasePendant ...
Document{      title: „Praxisbuch Mongo“,      version: 0.1,      copies_sold: 0,      authors: [         { name: „Uwe Sei...
JSON vs. BSON{ hello: "MongoDB" }x18x00x00x00   x02       hellox00       x08x00x00x00MongoDBx00x00codecentric AG   7
CRUD = IFUR                 insert(…)                 find(…), findOne(…)                 update(…)                 remove...
Java Persistenz mit MongoDB          MongoDB Java Driver          Spring Data MongoDB          Morphia          Hibernate ...
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      Responsibil...
MongoDB Java Driver      One JAR w/o further dependencies:      <dependency>         <groupId>org.mongodb</groupId>       ...
Java Driver: Connect to MongoDBimport com.mongodb.MongoClient;// Default: localhost:27017mongo = new MongoClient();// Shar...
Java Driver: Database / Collectionimport com.mongodb.DB;import com.mongodb.DBCollection;DB db = mongo.getDB("test");DBColl...
Java Driver: Documentsimport com.mongodb.BasicDBObject;import com.mongodb.DBObject;// insert documentDBObject doc = new Ba...
Java Driver: Queriesimport com.mongodb.DBCursor;DBCursor cursor;cursor = collection.find(); // all documents// documents w...
Java Driver: Order Use CaseDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject order;...
Java Driver: Order Use CaseDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order");DBObject query;...
Spring Data                  MongoDBcodecentric AG      20
Spring Data MongoDB – Fact Sheet  Vendor          VMware / SpringSource  License         Apache License, Version 2.0  Docu...
Spring DataCommon patterns for RDBMS and NoSQL data stores                                            Spring Data         ...
Spring Data MongoDBTemplating                 Resource abstraction                 Configure connections to mongod / mongo...
Spring Data MongoDB: Configuration<!-- Connection to MongoDB server --><mongo:db-factory host="localhost" port="27017" dbn...
Spring Data MongoDB: Object Mappingpublic class Order {  @Id private String id;  private Date date;  @Field("custInfo") pr...
Spring Data MongoDB: Repository Supportpublic interface OrderRepository extends  MongoRepository<Order, String> {     List...
Spring Data MongoDB: Additional Goodies        Map/Reduce / Aggregation framework        Index Management        Support f...
Hibernate OGMcodecentric AG       29
Hibernate OGM MongoDB – Fact Sheet  Vendor          JBoss / Redhat  License         GNU LGPL, Version 2.1  Documentation  ...
Hibernate OGM         Implements JPA API (subset)       JP-QL query are translated to native      datastore queries       ...
Hibernate OGMArchitectureSource:http://docs.jboss.org/hibernate/ogm/4.0/reference/en-     US/html/ogm-architecture.html#d0...
Hibernate OGM MongoDB: Configuration<persistence version="2.0" …>      <persistence-unit name="primary">         <provider...
Hibernate OGM MongoDB: Object Mapping@Entity@NamedQuery(      name="byItemsQuantity",      query = "SELECT o FROM Order o ...
Hibernate OGM MongoDB: Object Mapping@Embeddablepublic class Item {      private int quantity;      private double price; ...
Hibernate OGM: Summary         Very early beta         Only persist / merge / remove         No query support (yet)       ...
Hibernate OGM: OgmEntityManagercodecentric AG      37
Morphiacodecentric AG    38
Morphia – Fact Sheet  Developer       Scott Hernandez, James Green  License         Apache License, Version 2.0  Documenta...
Morphia: Object Mappingpublic class Order {      @Id private ObjectId id;      private Date date;      @Property("custInfo...
Morphia: Queriespublic class OrderDao extends BasicDAO<Order, ObjectId> {      List<Order> findByItemsQuantity(int quantit...
Morphia: Custom query syntax – why?                 Morphia            Mongo Query                 =                  $eq ...
Jongocodecentric AG   43
Jongo – Fact Sheet  Developer       Benoît Guérout, Yves Amsellem  License         Apache License, Version 2.0  Documentat...
Jongo: Object Mappingpublic class Order {  private ObjectId id;  private Date date;  @JsonProperty("custInfo") private Str...
Jongo: Queries// Java driver APIMongoClient mc = new MongoClient();DB db = mc.getDB("odm_jongo");// Jongo API entry pointJ...
Judge yourself …Spring Data MongoDBhttps://github.com/ttrelle/spring-data-examplesHibernate OGM MongoDBhttps://github.com/...
Summary                      ODM           Queries                      AnnotationsJava Driver           --            Nes...
Which one should I use?                                                             - Ready for production                ...
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            ...
Upcoming SlideShare
Loading in...5
×

BedCon 2013 - Java Persistenz-Frameworks für MongoDB

1,370

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,370
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "BedCon 2013 - Java Persistenz-Frameworks für MongoDB"

  1. 1. Java Persistenz-Frameworks für MongoDBTobias.Trelle@codecentric.de @tobiastrellecodecentric AG 1
  2. 2. Tobias Trelle - Senior IT Consultant @ codecentric AG (Düsseldorf) - Organisator MongoDB Usergruppe Düsseldorf - Autor MongoDB-Buch (dpunkt-Verlag)codecentric AG 2
  3. 3. Where have all my tables gone … ORM is dead long live ODMcodecentric AG 3
  4. 4. MongoDB? NoSQL-Datenbank / Open Source Dokumentenorientiert Hochperformant, horizontal skalierbar (scale-out) Replication & Sharding out-of-the-box Map/Reduce Geospatial Indexes / Queriescodecentric AG 4
  5. 5. Grundkonzept MongoDB-Server ServerRelationales DatabasePendant Aber … Flexibles Tabelle Collection Schema Zeile Document - Arrays Spalte Field - Rekursivcodecentric AG 5
  6. 6. 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
  7. 7. JSON vs. BSON{ hello: "MongoDB" }x18x00x00x00 x02 hellox00 x08x00x00x00MongoDBx00x00codecentric AG 7
  8. 8. CRUD = IFUR insert(…) find(…), findOne(…) update(…) remove()codecentric AG 8
  9. 9. Java Persistenz mit MongoDB MongoDB Java Driver Spring Data MongoDB Morphia Hibernate OGM Jongocodecentric AG 9
  10. 10. Use Casedb.order.find( {"items.quantity": ? } )codecentric AG 10
  11. 11. Mongo Java Drivercodecentric AG 11
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. Java Driver: Database / Collectionimport com.mongodb.DB;import com.mongodb.DBCollection;DB db = mongo.getDB("test");DBCollection collection = db.getCollection("foo");codecentric AG 15
  16. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. Spring Data MongoDBcodecentric AG 20
  21. 21. 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
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 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
  27. 27. Spring Data MongoDB: Additional Goodies Map/Reduce / Aggregation framework Index Management Support for GridFS Geopspatial indexes / queries Optimistic Lockingcodecentric AG 28
  28. 28. Hibernate OGMcodecentric AG 29
  29. 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
  30. 30. Hibernate OGM Implements JPA API (subset) JP-QL query are translated to native datastore queries Supports Infinispan, EhCache, MongoDBcodecentric AG 31
  31. 31. Hibernate OGMArchitectureSource:http://docs.jboss.org/hibernate/ogm/4.0/reference/en- US/html/ogm-architecture.html#d0e409codecentric AG 32
  32. 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
  33. 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
  34. 34. Hibernate OGM MongoDB: Object Mapping@Embeddablepublic class Item { private int quantity; private double price; @Column(name="desc") private String description; ...codecentric AG 35
  35. 35. Hibernate OGM: Summary Very early beta Only persist / merge / remove No query support (yet) Uses relational APIcodecentric AG 36
  36. 36. Hibernate OGM: OgmEntityManagercodecentric AG 37
  37. 37. Morphiacodecentric AG 38
  38. 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
  39. 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
  40. 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
  41. 41. Morphia: Custom query syntax – why? Morphia Mongo Query = $eq !=, <> $neq >, <, >=,<= $gt, $lt, $gte, $lte in, nin $in, $nin elem $elemMatch … ….codecentric AG 42
  42. 42. Jongocodecentric AG 43
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 49. MUG DüsseldorfMongoDB User Group Düsseldorfhttps://www.xing.com/net/mongodb-dus@MongoDUScodecentric AG 50
  50. 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

×