我对morphia很新,并努力让索引注释起作用。我在静态块中创建数据源并在同一个块中调用ensureIndexes,但它无法应用索引。如果我在保存对象之前把线放到正确的位置。
顺便说一下,我正在使用Playframework 2和Java。
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;
}
答案 0 :(得分:4)
您需要通过包或类来映射您的实体类:
ds = new Morphia().mapPackage("com.test.entities").createDatastore(mongoClient, dbname);
答案 1 :(得分:4)
Morphia正在使用的包加载器与播放框架试图使用的包加载器之间似乎存在冲突,我找不到确切的问题,但作为一种解决方法,我逐个映射每个对象,这似乎是工作
morph.map(User.class);
morph.map(Address.class);
.
.
.
答案 2 :(得分:1)
这是我在Play中的代码,它有效。请尝试:
modelClass = Class.forName(model, true, app.classloader());
morphia.map(modelClass);
答案 3 :(得分:0)
虽然对于OP来说这不是问题,但我发现即使@Entity类装饰器是可选的,如果它被省略,那么场级索引也不会被Morphia创建
答案 4 :(得分: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);
}
我的意思是,在插入之前先创建一个suresureIndexes