我有如下实体存根:
@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
答案 0 :(得分:1)
如果您在Company
和Category
之间有一个联接表,并且有一个额外的列可以提供ServiceType
,那么您可以使用@ElementCollection
注释来实现此目的。查看this blog post或在网上搜索更多示例。基本上,您可以在@OneToMany
集合上使用@ManyToMany
或categories
,然后在地图上使用@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
。