- Morphiaは非常に使いやすいです。 簡単で高速なフレームワークです。
- 注釈付きPOJOオブジェクトとDAOアプローチの両方をサポート
- 構成全体は注釈によって定義され、XMLファイルは使用されません
- 拡張インターフェイスがサポートされています(現在、検証はフレームワーク(jsr330)に組み込まれています)。
- Google Guice、Spring、およびその他のDIフレームワークで最適に動作します。
- 多数の拡張ポイントが含まれています
- GWTをサポート
Morphiaのエンティティは次のように説明されます。
@Entity("employees") class Employee { @Id ObjectId id; // , String firstName, lastName; // , Long salary = null; // -null Address address; // @Embedded ( , ) Key<Employee> manager; // ... @Reference List<Employee> underlings = new ArrayList<Employee>(); //... @Serialized EncryptedReviews; // @Property("started") Date startDate; // ... @Property("left") Date endDate; @Indexed boolean active = false; //... @NotSaved String readButNotStored; // , ... @Transient int notStored; //... transient boolean stored = true; // transient // , @PostLoad void postLoad(DBObject dbObj) { ... } }
次のようにデータベースを操作できます。
Morphia morphia = new Morphia(); db = new Mongo(); Datastore ds = morphia.createDatastore(db, appname, user, pass.toCharArray()); morphia.map(Employee.class); ds.save(new Employee("Mister", "GOD", null, 0)); // , Employee boss = ds.find(Employee.class).field("manager").equal(null).get(); // Key<Employee> scottsKey = ds.save(new Employee("Scott", "Hernandez", ds.getKey(boss), 150*1000)); // ds.update(boss, ds.createUpdateOperations(Employee.class).add("underlings", scottsKey)); // Employee scottsBoss = ds.find(Employee.class).filter("underlings", scottsKey).get(); for (Employee e : ds.find(Employee.class, "manager", boss)) print(e);
Fluent APIを使用して作成されたクエリの例:
Query q = ds.createQuery(MyEntity.class).filter("foo >", 12).filter("foo <", 30).order("dateAdded").offset(1000).retrievedFields(true, "foo"); // MyEntity e = ds.find(MyEntity.class).field("name").equal("someName").get(); // name = "someName"; List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).sort("-stars").asList();
DAOスタイルの作業例:
public class HotelDAO extends BasicDAO<Hotel, String> { public HotelDAO(Morphia morphia, Mongo mongo ) { super(mongo, morphia, "myDB"); } public List<Hotel> findByTitle( String title ) { Pattern regExp = Pattern.compile(name + ".*", Pattern.CASE_INSENSITIVE); return ds.find(Hotel.class).filter("title", regExp).sort("title").asList(); } } HotelDAO hDAO = new HotelDAO(...); List<Hotel> hotels = hDAO.findByTitle("Luxury"); hDAO.save(new Hotel(...));
参照:
- プロジェクトサイト: code.google.com/p/morphia
- StackOverflow: stackoverflow.com/questions/tagged/morphia
- Googleグループ: https : //groups.google.com/forum/#!forum / morphia