我正在尝试有一个一致的数据库,其中用户名和电子邮件是唯一的。
http://www.mongodb.org/display/DOCS/Indexes#Indexes-unique%3Atrue
http://code.google.com/p/morphia/wiki/EntityAnnotation
我的user类如下所示:
public class User {
@Indexed(unique = true)
@Required
@MinLength(4)
public String username;
@Indexed(unique = true)
@Required
@Email
public String email;
@Required
@MinLength(6)
public String password;
@Valid
public Profile profile;
public User() {
...我使用了@Indexed(unique=true)注释,但它不起作用。我的数据库里还有重复的东西。
你知道我该怎么解决这个问题吗?
编辑:
我读到过关于ensureIndexes的文章,但这似乎是一个错误的方法,我不想上传重复的数据,只是想看看它是否真的是重复的。
我想马上阻止它。
类似的东西
try{
ds.save(user);
}
catch(UniqueException e){
...
}发布于 2012-08-05 06:19:11
这里有关于唯一约束的很好的解释,Unique constraint with JPA and Bean Validation,这对你有帮助吗?因此,我要做的就是在检查其他错误时,在控制器级别(或bean validate())验证数据。这将完成工作,但它不会像使用注释那样酷。
编辑
或者看看这篇文章Inserting data to MongoDB - no error, no insert,它清楚地描述了mongodb在默认情况下不会引发唯一索引的错误,如果你没有告诉它,试着配置你的mongodb也抛出这些错误,看看你是否可以使用解决方案:
编辑2
我还想到,play 2有一个启动全局类,您可以在其中尝试访问数据库并运行索引列命令,如此电子邮件({db.things.ensureIndex:1},{唯一:真});??欲了解更多信息,请访问http://www.playframework.org/documentation/2.0/JavaGlobal
发布于 2012-08-05 08:11:15
如果要索引的列中已有重复项,则无法创建unique index。
我会尝试从mongo外壳运行您的ensureIndex命令:
db.user.ensureIndex({'username':1},{unique:true})
db.user.ensureIndex({'email':1},{unique:true})。。并检查索引是否已设置:
db.user.getIndexes()默认情况下,Morphia应该设置WriteConcern.SAFE,这将在尝试插入违反唯一索引的文档时抛出异常。
发布于 2013-09-09 03:35:24
我也遇到了同样的问题,play framework 1.2.6和morphia 1.2.12。
@Indexed(unique = true)注释的解决方案是让重新创建集合。因此,如果我已经有了mongo中的" Account“集合,并注释了email列,并重新启动了play应用程序,则帐户索引没有任何变化。
如果我删除了帐户收集,morphia会重新创建它,现在电子邮件列是唯一的:
> db.Account.drop()
true重启播放后:(我有一个创建初始帐户的工作...)
> db.Account.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "something.Account",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"email" : 1
},
"unique" : true,
"ns" : "something.Account",
"name" : "email_1"
}
]现在,在插入已经存在的电子邮件之后,我得到了一个MongoException.DuplicateKey异常。
https://stackoverflow.com/questions/11812177
复制相似问题