如何解决是否可以将Play Framework的CRUD模块配置为遵守@Columnunique = true注释?
| 我正在使用Play的CRUD模块创建一组简单的管理屏幕。我的模型之一是用户,我想对电子邮件字段实施唯一约束。 代码如下:public class User extends Model {
@Email
@Required
@Column(unique=true)
public String email;
管理屏幕正确显示-当我尝试破坏唯一性时(通过使用已经使用过的电子邮件保存用户),我收到此错误(在浏览器中):
Execution exception
PersistenceException occured : org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
In {module:crud}/app/controllers/CRUD.java (around line 100)
96:
} catch (TemplateNotFoundException e) {
97:
render(\"CRUD/show.html\",type,object);
98:
}
99:
}
100:
<b>object._save();</b>
101:
flash.success(Messages.get(\"crud.saved\",type.modelName));
102:
if (params.get(\"_save\") != null) {
103:
redirect(request.controller + \".list\");
104:
}
105:
redirect(request.controller + \".show\",object._key());
106:
}
我可以使用CRUD模块和列唯一性注释进行任何调整吗?
解决方法
您可以创建一个自定义检查并添加到User类的email属性中。
公共类UniqueCheck扩展了Check {
@Override
public boolean isSatisfied(Object validatedObject,Object value){
如果(StringUtils.isBlank((String)value)){
返回false;
}
返回User.findByEmail((String)value));
}
}
然后
公共类用户扩展模型{
@电子邮件
@需要
@MaxSize(值= 250)
@CheckWith(值= UniqueEmail.class,消息= \“已找到此电子邮件的现有帐户\”)
公共字符串电子邮件;
}
,在我看来,系统正在按照您的预期进行。我唯一能想到的就是修补CRUD模块以捕获此异常并变得更好,但是通常唯一约束是数据库端约束,只能通过尝试写入数据库来检查。因此,唯一约束不是验证注释(可以在写入数据库之前执行验证注释)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。