我在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的级联保存未按预期工作: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/