如何创建具有2个元素集合的实体?

时间:2011-11-26 10:16:11

标签: java hibernate jpa collections playframework

我有一个实体对象,其中包含两个元素集合:

@Entity
public class Report {

    // Electronic transactions items map
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "catElecItem_key", nullable = false)
    @Cascade(value = { CascadeType.ALL })
    public Map<Category, ReportItem> catElecItemMap;

    // Branch transactions items map
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "catBranchItem_key", nullable = false)
    @Cascade(value = { CascadeType.ALL })
    public Map<Category, ReportItem> catBranchItemMap;
}

在创建表格时,会生成一个名为 Report_ReportItem 的表格,用于执行类别与映射的 ReportItem 之间的映射。但是,当尝试保存地图时,这会失败,enther * catElecItem_key *或* catBranchItem_key *将为null。 如果我尝试使用 nullable = true 进行注释,则无法创建表,因为两个键都用作主键定义的一部分。

是否可以为每个集合指定使用不同的表?

2 个答案:

答案 0 :(得分:4)

您是否尝试过使用@CollectionTable注释?

@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="<custom_map_table_name>")
@MapKeyColumn(name = "catElecItem_key", nullable = false)
@Cascade(value = { CascadeType.ALL })
public Map<Category, ReportItem> catElecItemMap;

答案 1 :(得分:0)

使用 @CollectionTable 注释解决了问题。新课程现在看起来像:

@Entity
public class Report {
    // Electronic transactions items map
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "catElecItem_key", nullable = false)
    @CollectionTable(name = "TrxReportElecItems", joinColumns = @JoinColumn(name = "id"))
    @Cascade(value = { CascadeType.ALL })
    public Map<Category, ReportItem> catElecItemMap;

    // Branch transactions items map
    @ElementCollection(fetch = FetchType.EAGER)
    @MapKeyColumn(name = "catBranchItem_key", nullable = false)
    @CollectionTable(name = "TrxReportBranchItems", joinColumns = @JoinColumn(name = "id"))
    @Cascade(value = { CascadeType.ALL })
    public Map<Category, ReportItem> catBranchItemMap;
   ... 
}