我在Play 2框架中使用Ebean。两者对我来说都是很新的。我有两个模型AlgorithmSolution。 (一个Algorithm可以拥有多个Solution。)

@Entity
public class Algorithm extends Model{

    @Id
    public Long id;

    @Required
    public String name;

    public String description;

    @OneToMany(mappedBy="algorithm", cascade=CascadeType.ALL)
    public List<Solution> solutions;

    ...
}




@Entity
public class Solution extends Model {

    @Id
    public Long id;

    @Required
    public String explanation;
    public String code;

    @ManyToOne (cascade=CascadeType.ALL)
    public Algorithm algorithm;

    // **** I added it because the error message said algorithm_id is missing!!
    public Long algorithm_id;

    ...
}


我正在使用sqlite3,两个表的算法和解决方案的架构是:

CREATE TABLE algorithm(id INTEGER primary key, name varchar(255), description varchar(255));




CREATE TABLE "solution"(id INTEGER primary key, explanation varchar(255), code varchar(255), algorithm_id INTEGER);


因此,在我的Solution模型中,我最初没有行public Long algorithm_id;。问题是当我尝试创建新的Algorithm实例时,播放框架抱怨我错过了表algorithm_id中的列solution。因此,我在模型定义和db表中手动添加了algorithm_id,以使错误消息消失。但是,看来ebean的级联保存未按预期工作:ebean永远不会自动填充algorithm_id列。它总是空的。换句话说,解决方案实体和算法实体不在数据库中连接。

所以我的问题是:


我应该在模型和数据库中手动添加algorithm_id吗?如果没有,如何使algorithm_id自动生成?
在我的情况下,我的模型和数据库表架构应该是什么样?


谢谢。

最佳答案

添加algorithm_id时,从模型中删除public Algorithm algorithm字段-Ebean应该在数据库中创建名为algorithm_id的列,但是您不应在模型中手动复制它。

当然,如果启用了ebean插件,则可以正常工作;如果要手动进行更改,请在algorithm_id表中添加solution列。

小费

如果您不能和/或不想使用其他数据库引擎,那么花一些时间来使用Ebean插件支持的某些数据库-例如MySQL或Postgres-您将可以使用免费的GUI轻松检查它。创建一些裸露的项目以进行测试,创建几个具有不同方向关系的模型,并检查Ebean如何创建表,列,索引,约束等。请保留此项目以供参考。

关于sqlite - 如果使用Ebean ManyToOne关系,数据库表将是什么样?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16008550/

10-11 14:19