在activeJDBC中,如何强制存在与模型的一对多关系

时间:2017-04-07 21:50:33

标签: java activejdbc

假设我有以下数据库模型:

Car(
  id             INT
  plaque_id      INT

)

Plaque(
  id             INT
  identification TEXT
)

所以在ActiveJDBC中,我的模型是:

public class Car extends Model {

    static{
        validatePresenceOf("plaque_id");
    }

    public Car () {}
}

...

public class Plaque extends Model {

        static{
            validatePresenceOf("identification");
        }

        public Car () {}
    }

假设我的规格说:汽车必须有牌匾。

正如您所看到的,我正在对Car模型强制执行plaque_id。

现在。当我尝试这个时:

Car model_s = new Car();
Plaque plaque_a = new Plaque();

plaque_a.set("identification","A-8000");
plaque_a.saveIt();

car.add(plaque_a);
car.saveIt();

我抛出了以下异常:

  

java.lang.IllegalArgumentException:您只能添加关联的模型   到DB中存在的实例。首先保存此实例,然后保存   将能够添加依赖项。

如果我理解正确,我的汽车 model_s 必须首先保存才能链接牌匾 plaque_a 。但由于我的验证规则,我无法保存 model_s 而没有牌匾。这是一个捕获22。

注意:我是activeJDBC的新手。

1 个答案:

答案 0 :(得分:0)

我认为你倒退了。由于您的表Car有一列plaque_id,这意味着Plaque有许多Car(s),这是一对多关联:{{3 }}。

因此,您需要将Car添加到Plaque,而不是相反:

Car model_s = new Car();    // set parameters on the car
plaque_a.set("identification","A-8000");
plaque_a.saveIt();
plaque_a.add(model_s); 

其他建议:

1)在Java中,使用CamelCase:modelS,而不是model_s

2)将构造函数添加到Plaque

public class Plaque{
   public Plaque(String identification){ 
      set("identification", identification);
   }
   public Plaque(){} // must have default constructor
}

然后你的代码看起来更干净:

Car model_s = new Car();    // set parameters on the car
Plaque plaque = new Plaque("A-8000");
plaque_a.saveIt();
plaque_a.add(modelS); 

一般来说,尽量避免使用动态setter和getter,它们对于一个小项目是可以的,但是http://javalite.io/one_to_many_associations会让你获得Java重构的惊人能力,这是Ruby中没有的。