如果使用Ebean ManyToOne关系,数据库表会是什么样子?

时间:2013-04-15 06:01:39

标签: sqlite playframework-2.0 ebean

我在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的级联保存没有按预期工作:algorithm_id列永远不会被ebean自动填充。它总是空的。换句话说,解决方案实体和算法实体没有连接在数据库中。

所以我的问题是:

  1. 我应该在模型和数据库中手动添加algorithm_id吗?如果没有,如何自动生成algorithm_id?

  2. 在我的案例中,我的模型和数据库表模式应该是什么样的?

  3. 感谢。

1 个答案:

答案 0 :(得分:1)

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

当然,如果你启用了ebean插件,那么它是有效的,如果你手动进行更改,请将algorithm_id列添加到solution表。

提示

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