hibenrnate Annotation投射值类型集合
hibenrnate Annotation映射值类型集合
映射set集合
假定Customer类有一个集合属性images,用来存放所有照片的文件名。
/** *集合中存放的是值类型对象。值类型是相对于实体类型来讲的。区别在于无OID,无自己的生命周期 */ private Set<String> images=new TreeSet<String>();
按照集合的数据结构划分,java集合可分为三类。
-
Set:集合中的对象不按特点方式排序,并且没有重复对象。它的有些实现类(如TreeSet)能对集合中的对象按特定方式排序。
-
List:集合中的对象按索引位置排序,可以有重复对象,允许按照集合中的索引位置检索对象。
-
Map:集合中的每一个元素包含一个键对象和值对象。集合中没有重复的建对象,值对象可以重复。它的有些实现类(如TreeMap)能对集合中的键对象按特点方式排序
元素集合可用@CollectionOfElements来注解(作为@OneToMany的替代). 为了定义集合表(译注:即存放集合元素的表,与下面提到的主表对应),要在关联属性上使用@JoinTable注解, joinColumns定义了介乎实体主表与集合表之间的连接字段(inverseJoincolumn是无效的且其值应为空). 对于核心类型的集合或基本类型数组,你可以在关联属性上用@Column来覆盖存放元素值的字段的定义. 你还可以用@AttributeOverride来覆盖存放可内嵌对象的字段的定义. 要访问集合元素,需要将该注解的name属性值设置为"element"("element"用于核心类型,而"element.serial" 用于嵌入式对象的serial属性).要访问集合的index/key,则将该注解的name属性值设置为"key".
映射set集合
@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; }