mongoDB http://www.mongodb.org/
Morphia https://github.com/mongodb/morphia
DZone http://architects.dzone.com/articles/using-morphia-map-java-objects
MongoDB with Querydsl http://blog.mysema.com/2010/11/mongodb-with-querydsl.html
Querydsl http://www.querydsl.com/
Morphia is a lightweight type-safe library for mapping Java objects to/from MongoDB. Morphia provides a typesafe, and fluent Query API support with (runtime) validation. Morphia uses annotations so there are no XML files to manage or update. Morphia should feel very comfortable for any developer with JPA experience.
Features
- Lifecycle Method/Event Support
- Works great with Guice, Spring, and other DI frameworks.
- Many extension points (new annotations, converters, mapping behavior, logging, etc.)
- Does not store Null/Empty values (by default).
- GWT support (entities are just POJOs) -- (GWT ignores annotations)
- Advanced mapper which allows raw conversion,
void toObject(DBObject)
orDBObject fromObject(Object)
Please continue by reading the QuickStart or looking at a list of the annotations. If you have further questions, please reach out to us on our mailing list.
Quick start
Including morphia in your build
See the dependencies page for more detail.
Sample code
import com.mongodb.DBObject;
import org.bson.types.ObjectId;
import org.mongodb.morphia.Key;
import org.mongodb.morphia.annotations.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Entity("employees")
public class Employee {
@Id
private ObjectId id;
// value types are automatically persisted
private String firstName;
private String lastName;
// only non-null values are stored
private Long salary = null;
// by default fields are @Embedded
private Address address;
//references can be saved without automatic loading
private Key
//refs are stored**, and loaded automatically
@Reference
private List
// stored in one binary field
// @Serialized EncryptedReviews;
//fields can be renamed
@Property("started")
private Date startDate;
@Property("left")
private Date endDate;
//fields can be indexed for better performance
@Indexed
private boolean active = false;
//fields can loaded, but not saved
@NotSaved
private String readButNotStored;
//fields can be ignored (no load/save)
@Transient
private int notStored;
//not @Transient, will be ignored by Serialization/GWT for example.
private transient boolean stored = true;
//Lifecycle methods -- Pre/PostLoad, Pre/PostPersist...
@PostLoad
void postLoad(DBObject dbObj) {
}
public Employee() {
}
public Employee(String firstName, String lastName, Key
this.firstName = firstName;
this.lastName = lastName;
this.manager = manager;
this.salary = salary;
}
// getter and setter
......
}
public class Address {
private String country;
private String city;
private String address;
private String postcode;
// getter and setter
......
}
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.ServerAddress;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Key;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.query.UpdateResults;
import java.net.UnknownHostException;
public class EmployeeRepository {
private Morphia morphia;
private Datastore ds;
public static void main(String[] args) {
EmployeeRepository repository = new EmployeeRepository();
repository.init();
repository.test();
}
public void init() {
try {
Mongo mongo = new MongoClient(new ServerAddress("localhost", 27017));
morphia = new Morphia();
ds = morphia.createDatastore(mongo, "testdb");
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
public void test() {
ds.save(new Employee("Mister", "GOD", null, 0L));
// get an employee without a manager
Employee boss = ds.find(Employee.class).field("manager").equal(null).get();
Key
//add Scott as an employee of his manager
UpdateResults
// get Scott's boss; the same as the one above.
Employee scottsBoss = ds.find(Employee.class).filter("underlings", scottsKey).get();
for (Employee e : ds.find(Employee.class, "manager", boss))
System.out.println(e.getLastName() + " " + e.getFirstName());
}
}
Note: @Reference will not save objects, just a reference to them; You must save them yourself.