如果键是另一个使用注释的集合属性成员,如何映射“map”属性?

时间:2013-06-07 12:53:21

标签: java hibernate mapping hibernate-annotations

我有如下实体存根:

@Entity
public class Company extends AbstractEntity{

    private String name;
    private String address;
    private String zipCode;
    private String city;
    private String owner;
    private String website;
    private String emailAddress;
    private String phoneNumber;
    private String faxNumber;
    private List<Category> categories;
    private Map<Category, ServiceType> serviceType;

}

如您所见,此处的目标是创建一个映射(serviceType),其中键是另一个集合属性的成员(此处属性为categories)。换句话说,我想ServiceType Category存储categories; Category是另一个映射实体; 如何使用注释实现该目标? 使用Hibernate 4.2.1.Final

1 个答案:

答案 0 :(得分:1)

如果您在CompanyCategory之间有一个联接表,并且有一个额外的列可以提供ServiceType,那么您可以使用@ElementCollection注释来实现此目的。查看this blog post或在网上搜索更多示例。基本上,您可以在@OneToMany集合上使用@ManyToManycategories,然后在地图上使用@ElementCollection,如下所示。

@ElementCollection
// company_id is the column that connects the company table to the join table
@CollectionTable(name = "company_category_servicetypes", joinColumns = @JoinColumn(name = "company_id", insertable=true, updatable=true))
// service_type is the "extra" information you want on the relation, basically the value in the map
@Column(name = "service_type", insertable=true, updatable=true)
// category_id is the other side of the join table (connecting to the category table)
@MapKeyJoinColumn(name = "category_id", insertable=true, updatable=true)
private Map<Category, ServiceType> serviceType;

我建议你采用这种方法完全摆脱categories列表。如果多次映射相同的关系/连接表,则可能会导致问题和混淆。如果您有一些只想要公司类别的代码,而忽略了服务类型,那么您只需从keySet地图获取serviceType