我在Play 2框架中使用Ebean。两者对我来说都很新鲜。我有两个模型Algorithm
和Solution
。 (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自动填充。它总是空的。换句话说,解决方案实体和算法实体没有连接在数据库中。
所以我的问题是:
我应该在模型和数据库中手动添加algorithm_id吗?如果没有,如何自动生成algorithm_id?
在我的案例中,我的模型和数据库表模式应该是什么样的?
感谢。
答案 0 :(得分:1)
在添加algorithm_id
时,从模型中删除public Algorithm algorithm
字段 - Ebean应在名为algorithm_id
的数据库中创建列,但不应手动在模型中复制它。
当然,如果你启用了ebean插件,那么它是有效的,如果你手动进行更改,请将algorithm_id
列添加到solution
表。
提示强>
如果您不能和/或不想使用其他数据库引擎,花一些时间使用Ebean插件支持的某些数据库 - 例如MySQL或Postgres - 您将能够轻松地免费检查它图形用户界面。创建一些裸项目用于测试目的,创建几个具有不同方向关系的模型,并检查Ebean如何创建表,列,索引,约束等。保留此项目以供参考。