在Play2.0.2中使用Ebeans 我有两个这样的模型:
@Entity
@Table(name="GRP_MST")
public class GroupMst extends Model {
@Id
@Constraints.Required
@Formats.NonEmpty
public String groupid;
......
@OneToMany(cascade = CascadeType.ALL)
public List<DtlMenuGrp> dtlMenuGrpList; // This one is giving problems
}
我的DtlMenuGrp
模型看起来像:
@Entity
@Table(name="DTL_MENU_GRP")
public class DtlMenuGrp extends Model {
@Constraints.Required
@Formats.NonEmpty
public String groupid;
....
}
我想在我的控制器中加入以上两个模型:
GroupMst groupMst = GroupMst.find.where().eq("groupid",data.get("grpid")).findUnique();
List<DtlMenuGrp> dtlMenuGrpList = groupMst.dtlMenuGrpList;
但这让我在下面找不到列的重复:
Caused by: javax.persistence.PersistenceException: Query threw SQLException:Invalid column name 'group_mst_groupid'.
Bind values:[1000]
Query was:
select t0.groupid c0
, t1.groupid c1, t1.rightid c2, t1.status c3, t1.createdby c4, t1.createdon c5
from GRP_MST t0
left outer join DTL_MENU_GRP t1 on t1.group_mst_groupid = t0.groupid
where t0.groupid = ?
order by t0.groupid
为什么我的列已投放为group_mst_groupid
而不是groupid
答案 0 :(得分:1)
它无法作为gruopid
投放,因为您的DtlMenuGrp
也包含此类字段(nota bene你不忘记@id
注释吗?)
Ebean
为关联创建字段键有一些规则,group_mst_groupid
适合它,因为它是模型名称及其@Id
字段的组合。我刚刚测试了它将如何使用您给出的模型定义生成1.sql,它的创建方式如下:
create table DTL_MENU_GRP (
group_mst_groupid varchar(255) not null,
groupid varchar(255))
;
我对此没有任何错误。
我的建议是,尝试更改模型名称以避免在名称中使用神秘缩写,始终尝试为模型和字段找到可能的最短single
个字。尽量避免使用注释覆盖表名,直到确实需要它为止。然后,您将能够更快地找到错误,如果需要手动修复错误......
即。而是GroupMst
(表GRP_MST
)创建一个包含id
字段
@Entity
public class Group extends Model {
@Id
public Long id; //why not a numeric id? for an example Long ?
@OneToMany(cascade = CascadeType.ALL)
public List<Menu> menus;
// ...
}
猜猜......
@Entity
public class Menu extends Model {
@Id
public Long id;
// ...
}
然后,使用Ebean从头开始生成整个DDL,你会惊奇它是多么简单和合乎逻辑......