hibenrnate Annotation映射值类型集合

假定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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值