2013-07-20 21 views
2

我是morphia的新手,爲獲得索引註釋工作而苦苦掙扎。我在靜態塊中創建數據源並在同一個塊中調用ensureIndexes,但是它無法應用索引。如果我在保存它工作的對象之前放置這條線。帶嗎啡的索引註釋不起作用

順便說一句,我使用Java的playframework 2。

public class MongoService { 
static private MongoClient mongoClient = null; 
static Datastore ds = null; 

static { 
    MorphiaLoggerFactory.reset(); 
    MorphiaLoggerFactory.registerLogger(com.google.code.morphia.logging.slf4j.SLF4JLogrImplFactory.class); 
    try { 
     Logger.debug("mongo uri:" + mongoUri); 
     MongoClientURI uri = new MongoClientURI(mongoUri); 
     mongoClient = new MongoClient(uri); 
     ds = new Morphia().createDatastore(mongoClient, dbname); 
     ds.ensureIndexes(); 
     ds.ensureCaps(); 
    }catch(Exception e) { 
     Logger.error("exception:" + e.fillInStackTrace()); 
    } 

} 

public static User insertUser(User user) { 
    //ds.ensureIndexes(); //UNCOMMENTING THIS LINE MAKES IT WORK 
    ds.save(user); 
    return user; 
} 

這是用戶類的實現:

@Entity(noClassnameStored = true) 
public class User { 

@Id private ObjectId id; 

@Indexed(value=IndexDirection.ASC, name="email", unique=true, dropDups=true) 
public String email; 
} 

回答

4

似乎有一個Morphia正在使用的包裝加載器與玩框架試圖使用的包裝加載器之間的衝突,我無法找到確切的問題,但作爲解決方法,我逐個映射每個對象,似乎正在工作

morph.map(User.class); 
morph.map(Address.class); 
. 
. 
. 
+0

謝謝你的回答......我花了一段時間才弄清楚發生了什麼事。沿着你正在做的工作的一個更明確的解決方案是確保所有具有@Indexed註釋的類的索引是這樣的:ds.ensureIndexes(User.class,false)。最後一個參數指定索引構建是否發生在後臺。 –

4

你需要你的實體類映射 - 無論是通過包或類:

ds = new Morphia().mapPackage("com.test.entities").createDatastore(mongoClient, dbname); 
+0

我添加以下行\t DS =新的嗎啡()mapPackage( 「模型」)createDatastore(mongoClient,DBNAME)。模型是默認的模型和我的User類的玩包,但我得到這個異常:com.google.code.morphia.mapping.MappingException:無法從包模型 – nightograph

+0

獲得地圖類,當我添加此行:\t \t \t ds = new Morphia()。map(User.class).createDatastore(mongoClient,dbname);問題存在,嗎啡沒有考慮idnexes – nightograph

+0

我從來沒有用過Play,所以我不知道如何解決這個問題。我假設''新的Morphia()。mapPackage(YourEntity.class.getPackage()。getName())。createDatastore(mongoClient,dbname);''不起作用? – xeraa

1

這是我在Play中的代碼,它的工作原理。請嘗試:

modelClass = Class.forName(model, true, app.classloader()); 
morphia.map(modelClass);