JPA中的映射集合

CollectionModel.java
  
import hibernate.pojo.annotation.Image;
  
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
  
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.MapKeyColumn;
import javax.persistence.Table;
  
import org.hibernate.annotations.CollectionId;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.IndexColumn;
import org.hibernate.annotations.OrderBy;
import org.hibernate.annotations.Type;
  
@Entity
@Table (name = "collection" )
@GenericGenerator (name = "nat" , strategy = "increment" )
public class CollectionModel {
     @Id
     @GeneratedValue (generator = "nat" )
     private long id;
  
     private String name;
      
     /**
      * 对于@ElementCollection中targetClass代表的是collection类型,
      * 如果显示指定了collection类型,则hibernate不会自动侦测元素类型,此时必须告诉
      * 告诉hiberate应以何种type解析collection包含元素,
      * targetClass默认为集合类型,所以也可以写成@ElementCollection即可,
      * 如果没有显示指定集合类型,则可以省略@ElementCollection
      * 对于@JoinColumn属性nullable应该设为nullable = false,保证关联表数据保持一致
      */
     @ElementCollection (targetClass = java.lang.String. class )
     @JoinTable (name = "item" , joinColumns = { @JoinColumn (nullable = false , name = "item_id" , referencedColumnName = "id" ) })
     @Column (name = "filename" , nullable = false )
     private Set<String> images = new HashSet<String>();
  
     /**
     
      * 插入list集合
      * 【list集合中需要额外加入@IndexColumn】来建立一个序列标识符,
      * 如果无@IndexColumn,则会当做一个包集合处理,
      * 相当于xml中的<bag></bag>标签
      */
      
     @ElementCollection (targetClass = java.lang.String. class )
     @JoinTable (name = "item" , joinColumns = { @JoinColumn (nullable = false , name = "item_id" ) })
     @IndexColumn (name = "position" , base = 1 )
     /* 此处为list-index标识 位置 */
     @Column(name = "filename", nullable = false)
     @OrderBy(clause="item_id desc")
     private List<String> listImages = new ArrayList<String>();
      
     /**
     
      * 插入map集合
      * map集合中加入特殊的@MapKeyColumn
      */
     @ElementCollection
     @JoinTable(name="item", joinColumns={ @JoinColumn(nullable=false, name="item_id")})
     @MapKeyColumn(name="map_key")
     @Column(name="filename", nullable=false)
     private Map<String, String> mapImages = new HashMap<String, String>();
      
     /**
     
      *以一个组件的方式插入list中
      *以组件作为collection类型,此时作为类型的组件应该@Embeddable标记
      *private Collection<Image> list = new ArrayList<Image>();
      *如果此处改为private List<Image> list = new ArrayList<Image>();
      *则在组件所对应的表中,如果是复合主键,则需要让每一个主键都不能为空,如果其中有主键可以为空,那复合
      *主键的意义就不存在了
      *就如<bag></bag>和<idbag></idbag>标签类似,
      *可以加入一个代理主键【@CollectionId】,这样就不必限制符合主键内每个都不能
      *为空了,@CollectionId的generator属性不能为"native"
      */
     @ElementCollection
     @JoinTable(name="item_image", joinColumns= {@JoinColumn(nullable = false, name ="item_id")})
     @CollectionId(columns={@Column(name="item_auto_id")}, type=@Type(type="long"), generator="nat")
     private Collection<Image> list = new ArrayList<Image>();
  
     public long getId() {
         return id;
     }
  
     public void setId(long id) {
         this.id = id;
     }
  
     public String getName() {
         return name;
     }
  
     public void setName(String name) {
         this.name = name;
     }
  
     public Set<String> getImages() {
         return images;
     }
  
     public void setImages(Set<String> images) {
         this.images = images;
     }
  
     public List<String> getListImages() {
         return listImages;
     }
  
     public void setListImages(List<String> listImages) {
         this.listImages = listImages;
     }
  
     public Map<String, String> getMapImages() {
         return mapImages;
     }
  
     public void setMapImages(Map<String, String> mapImages) {
         this.mapImages = mapImages;
     }
  
     public Collection<Image> getList() {
         return list;
     }
  
     public void setList(Collection<Image> list) {
         this.list = list;
     }
}
  
  
  
Image.java
  
import javax.persistence.Column;
import javax.persistence.Embeddable;
  
@Embeddable
public class Image {
     private String filename;
      
     @Column(name="size_x")
     private int sizeX;
      
     @Column(name="size_y")
     private int sizeY;
  
     public boolean equals(Object obj) {
         if (!(obj instanceof Image))
             return false;
         Image image = (Image) obj;
         if ((image.getFilename().equals(this.getFilename()))
                 && (image.sizeX == this.getSizeX())
                 && image.getSizeY() == this.getSizeY()
                 )
             return true;
         else return false;
     }
  
     public int hashCode() {
         // TODO Auto-generated method stub
         return 0;
     }
  
     public String getFilename() {
         return filename;
     }
  
     public void setFilename(String filename) {
         this.filename = filename;
     }
  
     public int getSizeX() {
         return sizeX;
     }
  
     public void setSizeX(int sizeX) {
         this.sizeX = sizeX;
     }
  
     public int getSizeY() {
         return sizeY;
     }
  
     public void setSizeY(int sizeY) {
         this.sizeY = sizeY;
     }
}
  
  
Test:
  
public class CollectionTest {
     public static void main(String[] args) {
         CollectionModel model = new CollectionModel();
         model.setName("李四");
         /*插入数据
//      Set<String> set = new HashSet<String>();
//      set.add("lisi -1");
//      set.add("lisi -1");
//      model.setImages(set);
//      List<String> list = new ArrayList<String>();
//      list.add("张三");
//      list.add("李四");
//      list.add("王五");
//      model.setListImages(list);
         */
         /**
          * 针对map的测试类
          */
         /*Map<String, String> map = new HashMap<String,String>();
         map.put("key1", "value1");
         map.put("key2", "value2");
         map.put("key3", "value3");
         model.setMapImages(map);
          */
         List<Image> list = new ArrayList<Image>();
         Image image = new Image();
         image.setFilename( "file1" );
         image.setSizeX( 20 );
         image.setSizeY( 30 );
         list.add(image);
          
         image = new Image();
         image.setFilename( "file2" );
         image.setSizeX( 40 );
         image.setSizeY( 50 );
         list.add(image);
         model.setList(list);
         JPASessionFactory.persistenceObject(model);
     }
  
}
 
描述:Ⅰ.Hibernate annotations 对包含值类型的集合映射支持非标准的注解. 对于值类型的对象不具备数据库的同一性,它属于一个实体的实例,值类型的类没有标识符或者标识属性,值类型的实例的生命周期由所依附的实体实例的生命周期所决定,且值类型的对象不支持共享引用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值