是否可以将Play Framework的CRUD模块配置为遵守@Column(unique = 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模块以捕获此异常并变得更好,但是通常唯一约束是数据库端约束,只能通过尝试写入数据库来检查。因此,唯一约束不是验证注释(可以在写入数据库之前执行验证注释)。     

要回复问题请先登录注册