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

相关推荐

    Spring JPA 配置类包集合 方便大家使用

    Spring JPA,全称为Spring Data JPA,是Spring框架的一部分...这个“Spring JPA 配置类包集合”可能是为了方便开发者快速集成和配置Spring JPA项目,包含了一些常用的配置文件和实用工具类,有助于快速搭建和调试项目。

    JPA2映射的神秘之旅

    开发者可以使用@ElementCollection注解来映射存储在集合中的嵌入对象。 嵌入映射涉及到将多个实体字段嵌入到一个单独的表中,使用@Embedded和@Embeddable注解实现。这在多个实体共享一些公共属性时非常有用,如地址...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    - **查询语言JPA QL的扩展**:包括集合函数、子查询、构造函数表达式等。 - **Criteria API的增强**:提供了更强大的动态查询构建能力,无需硬编码SQL语句。 2. **JPA2映射**: - **基本类型映射**:如`@Basic`...

    JPA 资料大集合

    综上所述,JPA资料大集合涵盖了批注的详细使用,包括如何通过批注来定义实体和字段的映射规则;JPA的查询语言JPQL,用于在对象层面上执行复杂的查询操作;以及JPA的基础教程,全面教授如何在实际开发中运用JPA进行...

    jpa的实体映射关系7种

    在Java Persistence API (JPA) 中,实体映射关系是数据库关系模型与Java对象模型之间的桥梁,用于在ORM(对象关系映射)框架下管理数据。JPA 提供了多种映射关系,使得开发者能够方便地处理不同类型的关联。下面我们...

    JPA-4 映射关联关系

    在Java Persistence API (JPA) 中,映射关联关系是数据模型设计的重要组成部分。JPA 提供了多种方式来处理不同类型的关联关系,包括单向多对一、单向一对多、双向一对一、双向多对一和双向多对多。下面我们将详细...

    hibernate set 集合映射

    2. **元素类型**:集合中的每个元素都是一个实体对象,它们通常通过@ManyToOne或@OneToOne关联映射到单独的数据库表。 3. **关联映射**:集合映射通常涉及到两个实体之间的关联,如一对一(@OneToOne)、一对多(@...

    JPA一对一,一对多,多对多关系映射

    在JPA中,关系映射是核心特性之一,它将数据库表之间的关系映射为Java类之间的关系,使数据操作更加直观和方便。本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    删除孤儿意味着当从父实体的集合中移除一个子实体时,JPA会自动将其从数据库中删除。 四、配置和实践 在实践中,我们需要在实体类中正确地配置`@OneToMany`注解,包括指定目标实体、关联字段、映射类型等。同时,...

    JPA批注参考(主要介绍JPA中的相关注解)

    Java Persistence API (JPA) 是 Java 平台中用于处理对象关系映射(ORM)的标准接口。它简化了 Java 应用程序与关系型数据库之间的交互,使得开发者能够以面向对象的方式来操作数据库。本文将详细介绍 JPA 中的主要...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了ORM(对象关系映射)的过程。在JPA中,多对多(Many-to-Many)关联是一种常见的关系类型,适用于描述两个实体之间...

    JPA详细文档(JPA 批注参考)

    - `@MapKey` 和 `@OrderBy`:在映射关联集合时提供额外的排序和键控制。 6. **组合和继承批注**: - `@Embeddable`:标记一个类可以被其他实体嵌入,形成复合属性。 - `@Embedded`:将一个嵌入类包含在实体中。 ...

    JPA 标注 JPA标签手册

    注解是一种简单、表达性强的在Java源代码上添加元数据的方法,这些元数据在编译时会被嵌入到对应的Java类文件中,由TopLink JPA在运行时解释以管理JPA行为。 例如,要将一个Java类标记为JPA实体,可以使用@Entity...

    JPA讲解视频

    **Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为Java开发者提供了一种对象/关系映射工具来管理Java应用中的关系数据。JPA是Java EE和Java SE环境中持久化数据的标准方式...

    JPA标签(注解)详细说明

    Java 持续性API(JPA)是Java平台上的一个规范,用于处理对象关系映射(ORM),它简化了企业级Java应用中对数据库的访问。JPA允许开发者使用面向对象的编程模型来操作数据库,而无需深入理解底层的SQL语法。在JPA中...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    JPA允许我们定义对象-关系映射(ORM),使得我们可以用面向对象的方式来处理数据库数据。本资料主要探讨的是JPA中的一对多关系以及延迟加载机制,这两部分是JPA使用中的关键概念。 **一对多关系** 在关系数据库中...

    传智播客JPA学习笔记.pdf

    日期_枚举等字段类型的JPA映射** JPA提供了对不同数据类型的映射,如日期类型(@Temporal),枚举类型(@Enumerated),甚至自定义类型,通过Converter接口可以自定义数据类型转换。 **6. 大数据字段映射与字段...

    JPA大全之经典全集

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它是Java EE和Java SE环境中对象关系映射(ORM)的一部分。JPA通过提供API和元数据来描述如何将Java对象映射到数据库表,使得...

    JPA中的多对多双向关联实体定义与注解设置

    1. `@Entity`:标记一个类作为JPA的实体类,使得该类可以被JPA管理并映射到数据库表。 2. `@Table`:指定实体类对应的数据库表名。 3. `@Id`:标识实体类中的主键字段。 4. `@ManyToMany`:用于表示多对多关联。 5. ...

Global site tag (gtag.js) - Google Analytics