Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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            ...
Nächste SlideShare
Wird geladen in …5
×

BedCon 2013 - Java Persistenz-Frameworks für MongoDB

2.137 Aufrufe

Veröffentlicht am

  • Als Erste(r) kommentieren

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

×