Mongodb 的ORM框架 Morphia 註解三 —— @Indexed And @Embedded
@Indexed
此註解是為某個欄位申請一個索引。 當datastore.ensureIndexes() 方法被呼叫時 這些索引就會被申請.. 更多如下:
把@Indexed註解在你想讓MongoDB建立索引的屬性上。
@Entity
public class Product {
@Id
private ObjectId id;
@Indexed(value=IndexDirection.ASC, name="upc", unique=true, dropDups=true)
private String upcSymbol;
.......
}
引數說明如下:
value: 表名這個索引的方向; IndexDirection.ASC(升序),IndexDirection.DESC(降序), IndexDirection.BOTH(兩者)
預設為 升序;
name: 被建立的索引的 名稱; mongodb預設建立的索引名的格式為(key1_1/-1_key2_1)
unique: 建立一個唯一索引,當建立唯一索引後,當在此欄位插入相同的值時將會報錯。true:為唯一索引;false:不是唯一索引。
預設為:false
dropDups:此引數表明,當為某個欄位建立唯一索引時,刪除其他相同值的記錄。只保留第一條記錄。true:刪除重複,
false:不刪除重複(當有重複值時唯一索引建立失敗);預設為false.
向MongoDB申請建立索引 Datastore.ensureIndexes()需要被呼叫。這個方法應該在你已經使用Morphia註冊了你的實體類後
被呼叫。他將會非同步建立你的所有索引。 這個動作也許會在你每次啟動你的應用時都被執行。
注意:當在一個存在的系統上,建立已經存在的索引時,將不會花費任何事件(也不會做任何事情)。
Morphia m = .....
Datastore ds = ....
m.map(Product.class);
ds.ensureIndexes(); //為被@Indexed註解的所有欄位建立索引。
@Embedded
你可以建立一個類被巢狀在實體類中,在這種情況下我們可以使用@Embedded註解。例如,在Hotel類中 可能會有一個Address。
Address是Hotel不可分割的一部分,沒有ID, 並且不會被儲存在分開的collection中。在這種情況下我們可以使用@Embedded註解
Address.
@Entity
public class Hotel{
...
@Id
private ObjectId id;
@Embedded
private Address address;
...
}
@Embedded
public class Address{
...
}
正如你所看到的,被@Embedded註解的類沒有@Id。 這是因為他們經常被巢狀在其他類中。事實上,被@Embedded註解的類也不允許有@Id
英語水平有限,敬請大師斧正