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

Like this? Share it with your network

Share

BedCon 2013 - Java Persistenz-Frameworks für MongoDB

  • 1,606 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,606
On Slideshare
1,595
From Embeds
11
Number of Embeds
1

Actions

Shares
Downloads
0
Comments
0
Likes
1

Embeds 11

http://lanyrd.com 11

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Java Persistenz-Frameworks für MongoDBTobias.Trelle@codecentric.de @tobiastrellecodecentric AG 1
  • 2. Tobias Trelle - Senior IT Consultant @ codecentric AG (Düsseldorf) - Organisator MongoDB Usergruppe Düsseldorf - Autor MongoDB-Buch (dpunkt-Verlag)codecentric AG 2
  • 3. Where have all my tables gone … ORM is dead long live ODMcodecentric AG 3
  • 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. Grundkonzept MongoDB-Server ServerRelationales DatabasePendant Aber … Flexibles Tabelle Collection Schema Zeile Document - Arrays Spalte Field - Rekursivcodecentric AG 5
  • 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. JSON vs. BSON{ hello: "MongoDB" }x18x00x00x00 x02 hellox00 x08x00x00x00MongoDBx00x00codecentric AG 7
  • 8. CRUD = IFUR insert(…) find(…), findOne(…) update(…) remove()codecentric AG 8
  • 9. Java Persistenz mit MongoDB MongoDB Java Driver Spring Data MongoDB Morphia Hibernate OGM Jongocodecentric AG 9
  • 10. Use Casedb.order.find( {"items.quantity": ? } )codecentric AG 10
  • 11. Mongo Java Drivercodecentric AG 11
  • 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. 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. 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. 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. 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. 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. 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. 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. Spring Data MongoDBcodecentric AG 20
  • 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. 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. 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. 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. 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. 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. Spring Data MongoDB: Additional Goodies Map/Reduce / Aggregation framework Index Management Support for GridFS Geopspatial indexes / queries Optimistic Lockingcodecentric AG 28
  • 28. Hibernate OGMcodecentric AG 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. Hibernate OGM Implements JPA API (subset) JP-QL query are translated to native datastore queries Supports Infinispan, EhCache, MongoDBcodecentric AG 31
  • 31. Hibernate OGMArchitectureSource:http://docs.jboss.org/hibernate/ogm/4.0/reference/en- US/html/ogm-architecture.html#d0e409codecentric AG 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. 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. Hibernate OGM MongoDB: Object Mapping@Embeddablepublic class Item { private int quantity; private double price; @Column(name="desc") private String description; ...codecentric AG 35
  • 35. Hibernate OGM: Summary Very early beta Only persist / merge / remove No query support (yet) Uses relational APIcodecentric AG 36
  • 36. Hibernate OGM: OgmEntityManagercodecentric AG 37
  • 37. Morphiacodecentric AG 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. 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. 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. Morphia: Custom query syntax – why? Morphia Mongo Query = $eq !=, <> $neq >, <, >=,<= $gt, $lt, $gte, $lte in, nin $in, $nin elem $elemMatch … ….codecentric AG 42
  • 42. Jongocodecentric AG 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. 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. 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. 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. 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. 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. MUG DüsseldorfMongoDB User Group Düsseldorfhttps://www.xing.com/net/mongodb-dus@MongoDUScodecentric AG 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