代码之家  ›  专栏  ›  技术社区  ›  naoru

在play框架2中定义唯一约束

  •  2
  • naoru  · 技术社区  · 12 年前

    我有一个用户模型,它有一个由框架管理的Id,但也有一个电子邮件属性 我希望电子邮件是唯一的,目前我使用

    @Email
    @Required
    @Column(unique=true)
    public String email;
    

    这很好,但它抛出了一个PersistenceException。 play框架是否有一个验证,以便在表单级别进行处理。 我想避免用户周围的try-catch块。save()

    2 回复  |  直到 12 年前
        1
  •  1
  •   Alban Dericbourg    12 年前

    唯一约束仅指数据库:若它们是在表单级别定义的,则表单验证(“表面检查”)需要查询数据库来验证对象。

    我相信这个例外是你能找到的最好(或不那么糟糕)的解决方案。

    为了避免许多try/catch块,您可能有一个单独的“保存”入口点来完成这项工作。

        2
  •  0
  •   FrancescoM    10 年前

    我也有同样的问题。最后,我使用了一种方法来检查该电子邮件是否已经存在,如果已经存在,则在表单中添加一个错误。 类似这样的内容:

    Form<EntityClass> yourForm = Form.form(EntityClass.class).bindFromRequest();
    if (EntityClass.mailAlreadylExist(yourForm.data.get("email"))){
    List<ValidationError> validationErrorList = new ArrayList<>();
    validationErrorList.add(new ValidationError("" , "email already used"  ,new ArrayList<>()));
    yourForm.errors().put("", validationErrorList);
    }
    if (yourForm.hasErrors(){
    return badRequest(yourView.render(yourForm));
    } else {
    //Do your stuff here, no PersistenceException will be thrown due to duplicate email
    }
    

    为我工作,希望能有所帮助