-->

玩框架2.3如何添加唯一约束到示例应用程序(Play Framework 2.3 How to ad

2019-10-22 05:02发布

鉴于游戏框架2.3计算机数据库示例应用程序 ,我想练一个属性添加的唯一约束。 比方说,我想要的name的属性Computer类是唯一的。 我试图通过添加这样做validate()函数(吸气)到Computer.java

public List<ValidationError> validate() {

    List<ValidationError> errors = new ArrayList<ValidationError>();

    if(Computer.find.where().eq("name", getName()).findRowCount() != 0){
        errors.add(new ValidationError("name", "Name must be unique. That value is already taken."));
    }

    return errors;
}

public String getName() {
    return name;
}

在数据库中创建新记录时,该检查工作,然而,这现在导致验证错误,当你更新计算机对象,但不更改名称。 有没有办法添加唯一性约束,类似于到Rails ? 我如何可以验证独特的游戏?

谢谢!

更新 :看到答案由达维德 。

我结束了使用@Column(unique = true)从位于javax.persistence API约束。 这不会产生播放形式的错误; 相反,它抛出一个PersistenceException 。 因此,我不得不加改变我的控制器来实现我想要的行为。 无论是create()update()动作需要一个try / catch这样的:

 try {
     computerForm.get().save();
 } catch (PersistenceException pe) {
     flash("error", "Please correct errors below.");
     formData.reject("name", "Name conflict. Please choose a different name.");
     return badRequest(createForm.render(computerForm));
 }

更新2:下面的每个答案是一个可能的解决方案

Answer 1:

你需要从独特的检查,即这样的排除当前实体:

if(Computer.find.where().eq("name", getName()).ne("id", getId()).findRowCount() != 0){
     errors.add(new ValidationError("name", "Name must be unique."));
}

它会给你更新过程中的SQL查询:

select count(*) from computer t0 where t0.name = 'Foo' and t0.id <> 123 

而这个过程中创建:

select count(*) from computer t0 where t0.name = 'Foo' and t0.id is not null 

PS ne()表达式表示不等于当然这种方法假定你的name字段Required

编辑:我给你拉的请求与工作方案,所有你需要的是增加你的隐藏字段editForm这样的:

<input name="id" type="hidden" value='@computerForm("id").value'/>

另一件事是,可以简化模型,即不需要为干将公共领域。



Answer 2:

我不知道这是否回答你的问题,因为我不熟悉的Ruby语法。

要“在数据库中创建一个唯一性约束”可以使用的javax持久化API 。 Ebean也将认识到这一点。

有涉及单场普通的唯一性约束,您可以使用@Column批注 :

  @Entity
  public class Computer extends Model {
    ...

    @Column(unique = true)
    public String name;

    ...
  }

如果你需要的字段的组合是唯一的,而不是使用@Table注解

  @Table(
        uniqueConstraints=
            @UniqueConstraint(columnNames={"name", "brand"})
    )
  @Entity
  public class Computer extends Model {
    ...

    public String name;
    public String brand;

    ...
  }

我希望它能帮助!



文章来源: Play Framework 2.3 How to add unique constraint to sample application