0

我在 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

4

1 回答 1

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为模型和字段找到可能的最短单词。在真正需要之前,尽量避免使用注释覆盖表名。然后,您将能够更快地发现错误,并且如果需要手动修复它们...

IE。而是GroupMst(表GRP_MST)创建一个带有id字段的 Group 模型

@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,您会惊讶于它是多么简单和合乎逻辑……

于 2012-08-08T15:30:55.543 回答