2011-11-26 64 views
1

我有包含两个元件的集合作为这样的实体对象:如何创建包含2个元素集合的实体?

@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 *将为空。 如果我尝试使用nullable = true进行注释,表格将无法创建,因为两个键都用作主键定义的一部分。

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

回答

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; 
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; 
    ... 
} 
相关问题