1

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

@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实例时,播放框架抱怨我错过了 table 中的一algorithm_idsolution。所以我在模型定义和数据库表中手动添加了 algorithm_id 以使错误消息消失。但是,ebean 的级联保存似乎没有按预期工作:algorithm_id 列永远不会被 ebean 自动填充。它总是空的。换句话说,解决方案实体和算法实体在数据库中没有连接。

所以我的问题是:

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

  2. 在我的情况下,我的模型和数据库表模式应该是什么样的?

谢谢。

4

1 回答 1

1

在添加时从模型中删除该algorithm_id字段public Algorithm algorithm- Ebean 应该在调用的 DB 中创建列,algorithm_id但您不应该在模型中手动复制它。

当然,如果您启用了 ebean 插件,它会起作用,如果您手动进行更改,请将algorithm_id列添加到您的solution表中。

小费

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

于 2013-04-15T08:47:06.710 回答