`
dfl_tx1999
  • 浏览: 12860 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

JPA中的映射集合

    博客分类:
  • ORM
 
阅读更多
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 对包含值类型的集合映射支持非标准的注解. 对于值类型的对象不具备数据库的同一性,它属于一个实体的实例,值类型的类没有标识符或者标识属性,值类型的实例的生命周期由所依附的实体实例的生命周期所决定,且值类型的对象不支持共享引用。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics