非持久对象上的 ActiveJDBC UniquenessValidator

ActiveJDBC UniquenessValidator on non-persisted objects

我有以下型号:

Car (
  id   INT(11) NOT NULL AUTO_INCREMENT,
  name TEXT
)

..

public class Car extends Model {


    static{
        validatePresenceOf("name");
        validateWith(new UniquenessValidator("name"));
    }

    public Car() {}


}

在此模型中,我将所有汽车的名称指定为唯一的。

运行 以下代码不会在第二个实例中引发验证错误:

Car acura_1 = new Car();
acura_1.set("name","Acura");
acura_1.saveIt();

Car acura_2 = new Car();
acura_2.set("name","Acura");
acura_2.saveIt(); // << surprisingly, this works!

//acura_2.isValid(); 

我原以为 acura_2.saveIt() 会出现验证异常,因为名称 "Acura" 在 table 汽车中已经是 taken/present(即当 acura_1 被坚持了)。

查看 UniquenessValidator 的代码,如果我没记错的话,唯一性的验证似乎考虑到了模型的 id。

如果执行最后一行注释 (acura_2.isValid()),则错误消息出现在 acura_2 上:名称 -> 应该是唯一的。

我想知道为什么 UniquenessValidator 只对持久对象有效?

你是对的,这个验证器不是最好的。此问题已修复:https://github.com/javalite/activejdbc/issues/572 and JavaDoc added for UniquenessValidator

一般来说,我不建议在生产系统中使用这个验证器,因为它实际上并不能保证唯一性。请参阅 JavaDoc 以获取参数。