如何让我的模型类字段具有唯一性?例如。如果已经登录,我想为用户显示正确的消息。我必须写我自己的验证检查并使用它,或者可以使用JPA @UniqueConstraint
?玩! - 独特的模型字段
2
A
回答
5
我已经这样做了:
@Entity
public class User extends Model {
@Basic(optional=false) @Column(unique=true) public String name;
public User(String name) {
this.name = name;
create();
}
/** used in registration to find name clash */
public static User findByName(String name) {
return find("name", name).first();
}
}
然后在控制器,你做这样的事情:
public static void register(@Required String name) {
if(User.findByName(name)!=null) {
Validation.addError("name", "this name is not available");
}
if (validation.hasErrors()) {
validation.keep();
params.flash();
flash.error("Please correct the form data.");
signup(); // whatever your GET action was
}
User user = new User(name);
login(); // whatever your success action is
}
你可以做到这一点没有User.findByName()检查和你会得到一个ConstrainViolationException,但这当然不是非常用户友好的。您也可以尝试/捕获该异常。我更喜欢这两种方式,在数据库中用户友好且一致。
2
你必须写自己的支票。请参阅http://bazaar.launchpad.net/~opensource21/+junk/permsec/files/head:/app/de/ppi/util/validation/ 我几个月前写过这篇文章,不幸的是我现在没有时间玩。
0
我通过在我的crud控制器中重写创建方法来实现此目的。在validaiton.hasErrors()方法之前调用一个自定义validateUniqueFields方法。然后,我可以为我独特的字段返回有效的错误。
public static void create() throws Exception
{
ObjectType type = ObjectType.get(getControllerClass());
notFoundIfNull(type);
Constructor<?> constructor = type.entityClass.getDeclaredConstructor();
constructor.setAccessible(true);
Model object = (Model) constructor.newInstance();
Binder.bindBean(params.getRootParamNode(), "object", object);
validation.valid(object);
validateUniqueFields(object);
if (validation.hasErrors()) {
renderArgs.put("error", play.i18n.Messages.get("crud.hasErrors"));
try {
render(request.controller.replace(".", "/") + "/blank.html", type, object);
} catch (TemplateNotFoundException e) {
render("CRUD/blank.html", type, object);
}
}
object._save();
flash.success(play.i18n.Messages.get("crud.created", type.modelName));
if (params.get("_save") != null) {
redirect(request.controller + ".list");
}
if (params.get("_saveAndAddAnother") != null) {
redirect(request.controller + ".blank");
}
redirect(request.controller + ".show", object._key());
}
private static void validateUniqueFields(Model object) {
String value = ((CastModelHere)object).identifier;
String ident = "identifier";
if(TUCharacterTypeIdentifier.find(ident, value).first() != null)
{
validation.addError("object." + ident, ident + " already taken");
}
}
相关问题
- 1. mysql独特字段
- 2. INSERT INTO独特的字段
- 3. 更改表字段独特
- 4. 没有创建独特的模型? Backbone.js
- 5. C# - 2字段DataTable列 - 独特的值
- 6. PHP - 独特的字段不被识别
- 7. Solr独特的多值字段
- 8. 在yii用户模块中创建一个独特的字段
- 9. 将模型字段插入Django中现有的模型字段
- 10. Django:模型字段内的子字段
- 11. Django模型:参考字段返回多种类型的模型
- 12. 为Django模型创建一个长度为5个字符的独特字段的正确方法是什么?
- 13. 独特的名字
- 14. 独立模型
- 15. 什么字段类型用于Django中的模型字段?
- 16. 独特的房间类型
- 17. 允许cancan Ability.rb只管理访问模型的特定字段
- 18. CakePHP - 模型中特定字段的递归?
- 19. Django模型迭代字段
- 20. Django模型字段索引
- 21. NULL字段文档模型
- 22. TypeError与模型字段
- 23. django模型字段比较
- 24. Django模型 “斑点” 字段
- 25. 填充Django模型字段
- 26. Django Blob模型字段
- 27. 与模型字段名
- 28. 使用字段从模型
- 29. 2个不同的模型共享1个独特的照片模型
- 30. 单独的ID字段的单独列?
我也在想抓住异常,但我觉得这有点“不整齐”。我已经做了类似于你所提议的事情,但我仍然缺少模型中的唯一性,所以我会补充说一致。 – jjczopek 2011-05-30 23:11:26