假定Customer类有一个集合属性images,用来存放所有照片的文件名。
/** *集合中存放的是值类型对象。值类型是相对于实体类型来讲的。区别在于无OID,无自己的生命周期 */ private Set<String> images=new TreeSet<String>();
按照集合的数据结构划分,java集合可分为三类。
元素集合可用@CollectionOfElements来注解(作为@OneToMany的替代). 为了定义集合表(译注:即存放集合元素的表,与下面提到的主表对应),要在关联属性上使用@JoinTable注解, joinColumns定义了介乎实体主表与集合表之间的连接字段(inverseJoincolumn是无效的且其值应为空). 对于核心类型的集合或基本类型数组,你可以在关联属性上用@Column来覆盖存放元素值的字段的定义. 你还可以用@AttributeOverride来覆盖存放可内嵌对象的字段的定义. 要访问集合元素,需要将该注解的name属性值设置为"element"("element"用于核心类型,而"element.serial" 用于嵌入式对象的serial属性).要访问集合的index/key,则将该注解的name属性值设置为"key".
@Entity @Table(name="customers") public class Customer implements Serializable { private Long id; private String name; private int age; private Set<String> images=new TreeSet<String>(); @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } @CollectionOfElements() @JoinTable(name="IMAGES",joinColumns={@JoinColumn(name="CUSTOMER_ID")}) @Column(name="filename",nullable=false) public Set<String> getImages() { return images; } public void setImages(Set<String> images) { this.images = images; } }映射bag包
bag集合中的对象可以重复,但不按特定方式排序。hibernate允许你用list来模拟bag行为。
@CollectionOfElements @CollectionId(columns = @Column(name="imageid",nullable=false), type=@Type(type="long"), generator = "sys-increment") @GenericGenerator(name="sys-increment",strategy="increment") @JoinTable(name="IMAGES",joinColumns={@JoinColumn(name="CUSTOMER_ID")}) @Column(name="FILENAME") public List<String> getImages() { return images; } public void setImages(List<String> images) { this.images = images; }
映射LIST列表
集合中的对象可以重复,并且按索引位置排序
@CollectionOfElements @JoinTable(name="images",joinColumns={@JoinColumn(name="customerid")}) @IndexColumn(name = "imageid") @Column(name="filename",nullable=false) public List<String> getImages() { return this.images; } public void setImages(List<String> images) { this.images = images; }
映射map
@CollectionOfElements @org.hibernate.annotations.MapKey(columns={@Column(name="image_name",nullable=false)}) @JoinTable(name="images",joinColumns={@JoinColumn(name="customerid")}) @Column(name="filename",nullable=false) @Sort(type=SortType.NATURAL) public Map<String,String> getImages() { return this.images; } public void setImages(Map<String,String> images) { this.images = images; }
映射组件类型集合
映射方式和以上大致相同。以map举例。
@Embeddable public class Image implements Serializable { //private String name; private String filename; private int sizeX; private int sizeY; private Customer customer; }
@CollectionOfElements @MapKey(columns={@Column(name = "name",nullable=false)}) @JoinTable(name="IMAGES",joinColumns={@JoinColumn(name="CUSTOMER_ID",nullable=false)}) /* 不可与@MapKey一起使用?以下一般用来复写组件类的属性 * @AttributeOverrides({ //@AttributeOverride(name="element.name",column=@Column(name="IMAGE_NAME")), @AttributeOverride(name="element.filename",column=@Column(name="FILENAME")), @AttributeOverride(name="element.sizeX",column=@Column(name="SIZEX")), @AttributeOverride(name="element.sizeY",column=@Column(name="SIZEY")) })*/ public Map<String,Image> getImages() { return this.images; }