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

5 回答 5

4

您需要按包或按类映射实体类:

ds = new Morphia().mapPackage("com.test.entities").createDatastore(mongoClient, dbname);
于 2013-07-20T16:36:45.763 回答
4

Morphia 正在使用的包加载器与 play 框架尝试使用的包加载器之间似乎存在冲突,我找不到确切的问题,但作为一种解决方法,我正在逐个映射每个对象,这似乎正在工作

 morph.map(User.class);
 morph.map(Address.class);
 . 
 . 
 . 
于 2013-07-25T21:30:35.453 回答
1

这是我在 Play 中的代码,它可以工作。请试试:

 modelClass = Class.forName(model, true, app.classloader());
 morphia.map(modelClass);
于 2015-07-16T10:48:48.880 回答
0

虽然对于 OP 这不是问题,但我发现即使 @Entity 类装饰器是可选的,如果它被遗漏,那么 Morphia 不会创建字段级索引。

于 2018-05-02T05:45:39.673 回答
0

我通过这种形式解决了这个问题:

public void create(Producto p) {
        Morphia m =new Morphia();
        Datastore ds = m.mapPackage("ec.edu.espe.as.model.Producto").createDatastore(new MongoClient(), "productoPrueba");              
        DBObject dbo = m.toDBObject(p);        
        ds.ensureIndexes();
        ds.getCollection(Producto.class).insert(dbo);
    }

我的意思是,在插入之前制作 ensureIndexes

于 2018-12-13T06:41:27.423 回答