Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

BedCon 2013 - Java Persistenz-Frameworks für MongoDB

2,135 views

Published on

  • Be the first to comment

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

×