Hibernate 是否可以配置播放框架';s CRUD模块是否考虑@Column(unique=true)注释?

Hibernate 是否可以配置播放框架';s CRUD模块是否考虑@Column(unique=true)注释?,hibernate,frameworks,playframework,crud,unique-constraint,Hibernate,Frameworks,Playframework,Crud,Unique Constraint,我正在使用Play的CRUD模块创建一组简单的管理屏幕。我的一个模型是User,我想在email字段上强制一个唯一的约束 代码如下所示: public class User extends Model { @Email @Required @Column(unique=true) public String email; 管理屏幕显示正确-当我尝试打破唯一性(通过使用已使用的电子邮件保存用户)时,我(在浏览器中)出现以下错误: 执行异常 发生Persistenc

我正在使用Play的CRUD模块创建一组简单的管理屏幕。我的一个模型是User,我想在email字段上强制一个唯一的约束

代码如下所示:

public class User extends Model {
    @Email
    @Required
    @Column(unique=true)
    public String email;
管理屏幕显示正确-当我尝试打破唯一性(通过使用已使用的电子邮件保存用户)时,我(在浏览器中)出现以下错误:

执行异常
发生PersistenceException:org.hibernate.exception.ConstraintViolationException:无法执行JDBC批处理更新
在{module:crud}/app/controllers/crud.java中(大约第100行)
96:
}捕获(TemplateNotFounde异常){
97:
呈现(“CRUD/show.html”,类型,对象);
98:
}
99:
}
100:
对象。_save();
101:
success(Messages.get(“crud.saved”,type.modelName));
102:
if(params.get(“\u save”)!=null){
103:
重定向(request.controller+“.list”);
104:
}
105:
重定向(request.controller+“.show”,object._key());
106:
}

在使用CRUD模块和列唯一性注释时,我能做些什么调整吗?

我觉得系统正按照您的预期运行。我唯一能想到的是修补CRUD模块以捕获此异常并变得更好,但通常唯一约束是数据库端约束,只能通过尝试写入数据库来检查。因此,唯一约束不是验证注释(可以在写入数据库之前执行)。

您可以创建自定义检查并添加到用户类中的电子邮件属性

public class UniqueCheck extends Check { @Override public boolean isSatisfied(Object validatedObject, Object value) { if (StringUtils.isBlank((String) value)) { return false; } return User.findByEmail((String) value)); } } 公共类UniqueCheck扩展了Check{ @凌驾 公共布尔值已满足(对象验证对象、对象值){ if(StringUtils.isBlank((字符串)值)){ 返回false; } 返回User.findByEmail((字符串)值)); } } 然后

公共类用户扩展模型{ @电子邮件 @必需的 @最大尺寸(值=250) @CheckWith(value=UniqueEmail.class,message=“已通过此电子邮件找到现有帐户”) 公共字符串电子邮件; }
是的,我同意约束条件按我的意愿运行。这是CRUD模块中的补丁,因此我可以给我想知道的用户一个优雅的响应。也许这超出了简单CRUD工具的范围。这种方法的一个问题是,当我编辑现有记录并保存它时,它还会告诉我找到了帐户。我怎么能让它只在创建新项目而不是修改现有项目时进行检查?检查id字段,如果为空,则知道它是一条新记录。 public class UniqueCheck extends Check { @Override public boolean isSatisfied(Object validatedObject, Object value) { if (StringUtils.isBlank((String) value)) { return false; } return User.findByEmail((String) value)); } } public class User extends Model { @Email @Required @MaxSize(value = 250) @CheckWith(value = UniqueEmail.class, message = "Existing account has been found with this e-mail") public String email; }