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.

Java Persistence Frameworks for MongoDB


Published on

  • Dating for everyone is here: ♥♥♥ ♥♥♥
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ♥♥♥ ♥♥♥
    Are you sure you want to  Yes  No
    Your message goes here
  • You should also look at
    Are you sure you want to  Yes  No
    Your message goes here
  • Strange that you don't even give the slightest mention to DataNucleus JDO/JPA which has supported JDO/JPA persistence to MongoDB since a long time before Hibernate OGM, and supports way more features than what you present in this presentation. It's even mentioned in the MongoDB docs from what I remember ...
    Are you sure you want to  Yes  No
    Your message goes here

Java Persistence Frameworks for MongoDB

  1. 1. MongoDB Berlin 2013:Java Persistence Frameworks for / @codecentric AG @tobiastrelle
  2. 2. Tobias Trelle - Senior IT Consultant @ codecentric AG (official 10gen partner) official - Conference talks on MongoDB - MongoDB user group Düsseldorf/Germany - Authoring a German book on MongoDBcodecentric AG
  3. 3. Where have all my tables gone … ORM is dead long live ODMcodecentric AG
  4. 4. Agenda− MongoDB Java D Driver− Spring Data MongoDB− Morphia− Hibernate OGMcodecentric AG
  5. 5. Use Casecodecentric AG
  6. 6. Mongo Java Drivercodecentric AG
  7. 7. 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: AG
  8. 8. MongoDB Java Driver− One JAR w/o further dependencies ependencies: <dependency> <groupId>org.mongodb</ </groupId> <artifactId>mongo-java java-driver</artifactId> <version>2.10.0</version version> </dependency>− github: AG
  9. 9. Java Driver: Connect to MongoDBimport com.mongodb.MongoClient com.mongodb.MongoClient;// Default: localhost:27017mongo = new MongoClient();// Sharding: mongos servermongo = new MongoClient("mongos01" 4711); "mongos01",// Replica setmongo = new MongoClient(Arrays. Arrays.asList( new ServerAddress("replicant01" 10001), "replicant01", new ServerAddress("replicant02" 10002), "replicant02", new ServerAddress("replicant03" 10003) "replicant03", ));codecentric AG
  10. 10. Java Driver: Database / Collectionimport com.mongodb.DB com.mongodb.DB;import com.mongodb.DBCollection com.mongodb.DBCollection;DB db = mongo.getDB mongo.getDB("test");DBCollection collection = db.getCollection("foo"); db.getCollectioncodecentric AG
  11. 11. Java Driver: Documentsimport com.mongodb.BasicDBObject com.mongodb.BasicDBObject;import com.mongodb.DBObject com.mongodb.DBObject;// insert documentDBObject doc = new BasicDBObject();doc.put("date", new Date());doc.put("i", 42);collection.insert(doc doc);codecentric AG
  12. 12. Java Driver: Queriesimport com.mongodb.DBCursor com.mongodb.DBCursor;DBCursor cursor;cursor = collection.find(); // all documents ();// documents w/ {i: 42}cursor = collection.find( ( new BasicDBObject("i i", 42) );document =; ();...codecentric AG
  13. 13. Java Driver: Order Use CaseDB db = mongo.getDB("test");DBCollection collection = db.getCollection("order" "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
  14. 14. Spring Data MongoDBcodecentric AG
  15. 15. Spring Data MongoDB – Fact Sheet Vendor VMware / SpringSource License Apache License Version 2.0 License, Documentation Main Features • Repository Support • Object/Document Mapping Document • Templatingcodecentric AG
  16. 16. 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: AG
  17. 17. 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 documents ,Repository Support − Queries are derived from methods signatures − Geospatial Queriescodecentric AG
  18. 18. Spring Data MongoDB TemplateConfiguration <!-- Connection to MongoDB server -- --> <mongo:db-factory host="localhost" port port="27017" dbname="test" /> <!-- MongoDB Template --> <bean id="mongoTemplate" class=""> <constructor-arg name="mongoDbFactory ref="mongoDbFactory"/> mongoDbFactory" </bean>Usage @Autowired MongoTemplate template; template.indexOps(Location.class).ensureIndex ensureIndex( new GeospatialIndex("position") ); )codecentric AG
  19. 19. 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 description; ...}codecentric AG
  20. 20. Spring Data MongoDB: Repository Supportpublic interface OrderRepository extends MongoRepository<Order, String> { <Order, findByItemsQuantity(int quantity); List<Order> findByItemsQuantity findByItemsPriceGreaterThan(double price); List<Order> findByItemsPriceGreaterThan}codecentric AG
  21. 21. 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 − Paging − Sortingcodecentric AG
  22. 22. Spring Data MongoDB: Additional Goodies− Map/Reduce / Aggregation framework− Index Management− Support for GridFS− Geopspatial indexes / queries− Optimistic Lockingcodecentric AG
  23. 23. Hibernate OGMcodecentric AG
  24. 24. Hibernate OGM MongoDB – Fact Sheet Vendor JBoss / Redhat License GNU LGPL, Version 2.1 , Documentation Main Features • JPA API (Subset Subset) • JPQL Query Languagecodecentric AG
  25. 25. Hibernate OGM− Implements JPA API (subset)− JP-QL query are translated to native QL datastore queries− Supports Infinispan, EhCache, MongoDB ,codecentric AG
  26. 26. Hibernate OGMArchitectureSource: /en-US/html/ogm-architecture.html#d0e409codecentric AG
  27. 27. Hibernate OGM MongoDB: Configuration<persistence version="2.0" …> <persistence-unit name="primary"> <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence HibernateOgmPersistence</provider> <class>hibernate.Order</class> <class>hibernate.Item</class> <properties> <property name="hibernate.ogm.datastore.provider hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider" "org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> <property name="hibernate.ogm.mongodb.database value=„odm"/> hibernate.ogm.mongodb.database" <property name=" value=„localhost"/>" <property name="hibernate.ogm.mongodb.port value=„27017"/> hibernate.ogm.mongodb.port" </properties> </persistence-unit></persistence>codecentric AG
  28. 28. 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" "uuid2") @Id private String id; private Date date; @Column(name = "custInfo") private String customerInfo customerInfo; @ElementCollection private List<Item> items;codecentric AG
  29. 29. Hibernate OGM MongoDB: Object Mapping@Embeddablepublic class Item { private int quantity; private double price; @Column(name="desc") private String description description; ...codecentric AG
  30. 30. Hibernate OGM: Summary− Very early beta− Only persist / merge / remove nly− No query support (yet) o− Uses relational APIcodecentric AG
  31. 31. Hibernate OGM: OgmEntityManagercodecentric AG
  32. 32. Morphiacodecentric AG
  33. 33. Morphia – Fact Sheet Developer Scott Hernandez, James Green License Apache License Version 2.0 License, Documentation Main Features • Object/Document Mapping Document • Custom Query API • DAO supportcodecentric AG
  34. 34. 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 description; ...}codecentric AG
  35. 35. Morphia: Queriespublic class OrderDao extends BasicDAO BasicDAO<Order, ObjectId> { List<Order> findByItemsQuantity(int quantity) { return find( createQuery().filter("items.quantity items.quantity", quantity)) .asList(); } findByItemsPriceGreaterThan(double price) { List<Order> findByItemsPriceGreaterThan return find( createQuery().field("items.price items.price").greaterThan(price) ) .asList(); } …}codecentric AG
  36. 36. Morphia: Custom query syntax – why? Morphia Mongo Query = $eq $ !=, <> $neq $ >, <, >=,<= $gt, $ $lt, $gte, $lte in, nin $in, $ $nin elem $elemMatch $ … ….codecentric AG
  37. 37. Judge yourself …Spring Data MongoDB OGM MongoDB AG
  38. 38. Which one should I use? High Abstraction Spring Data MongoDB JPA Hibernate OGM MorphiaEnterprise CustomStandard API MongoDB Java JDBC Driver Low Abstraction codecentric AG
  39. 39. German MongoDB User Groups (MUGs)MUG Düsseldorf MUG Berlin @MUGBerlinMUG Frankfurt/Main Hamburg MUG München MongoDB-User-Group/@mongomuccodecentric AG
  40. 40. QUESTIONS?Tobias Trellecodecentric AGMerscheider Str. 142699 Solingentel +49 (0) 212.233628.47fax +49 (0) 212.233628.79mail Tobias.Trelle@codecentric.detwitter AG