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 Data JPA,是Spring框架的一部分...这个“Spring JPA 配置类包集合”可能是为了方便开发者快速集成和配置Spring JPA项目,包含了一些常用的配置文件和实用工具类,有助于快速搭建和调试项目。
开发者可以使用@ElementCollection注解来映射存储在集合中的嵌入对象。 嵌入映射涉及到将多个实体字段嵌入到一个单独的表中,使用@Embedded和@Embeddable注解实现。这在多个实体共享一些公共属性时非常有用,如地址...
- **查询语言JPA QL的扩展**:包括集合函数、子查询、构造函数表达式等。 - **Criteria API的增强**:提供了更强大的动态查询构建能力,无需硬编码SQL语句。 2. **JPA2映射**: - **基本类型映射**:如`@Basic`...
综上所述,JPA资料大集合涵盖了批注的详细使用,包括如何通过批注来定义实体和字段的映射规则;JPA的查询语言JPQL,用于在对象层面上执行复杂的查询操作;以及JPA的基础教程,全面教授如何在实际开发中运用JPA进行...
在Java Persistence API (JPA) 中,实体映射关系是数据库关系模型与Java对象模型之间的桥梁,用于在ORM(对象关系映射)框架下管理数据。JPA 提供了多种映射关系,使得开发者能够方便地处理不同类型的关联。下面我们...
在Java Persistence API (JPA) 中,映射关联关系是数据模型设计的重要组成部分。JPA 提供了多种方式来处理不同类型的关联关系,包括单向多对一、单向一对多、双向一对一、双向多对一和双向多对多。下面我们将详细...
2. **元素类型**:集合中的每个元素都是一个实体对象,它们通常通过@ManyToOne或@OneToOne关联映射到单独的数据库表。 3. **关联映射**:集合映射通常涉及到两个实体之间的关联,如一对一(@OneToOne)、一对多(@...
在JPA中,关系映射是核心特性之一,它将数据库表之间的关系映射为Java类之间的关系,使数据操作更加直观和方便。本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ...
删除孤儿意味着当从父实体的集合中移除一个子实体时,JPA会自动将其从数据库中删除。 四、配置和实践 在实践中,我们需要在实体类中正确地配置`@OneToMany`注解,包括指定目标实体、关联字段、映射类型等。同时,...
Java Persistence API (JPA) 是 Java 平台中用于处理对象关系映射(ORM)的标准接口。它简化了 Java 应用程序与关系型数据库之间的交互,使得开发者能够以面向对象的方式来操作数据库。本文将详细介绍 JPA 中的主要...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了ORM(对象关系映射)的过程。在JPA中,多对多(Many-to-Many)关联是一种常见的关系类型,适用于描述两个实体之间...
- `@MapKey` 和 `@OrderBy`:在映射关联集合时提供额外的排序和键控制。 6. **组合和继承批注**: - `@Embeddable`:标记一个类可以被其他实体嵌入,形成复合属性。 - `@Embedded`:将一个嵌入类包含在实体中。 ...
注解是一种简单、表达性强的在Java源代码上添加元数据的方法,这些元数据在编译时会被嵌入到对应的Java类文件中,由TopLink JPA在运行时解释以管理JPA行为。 例如,要将一个Java类标记为JPA实体,可以使用@Entity...
**Java Persistence API (JPA)** 是Java平台上的一个标准,用于管理关系数据库中的数据,它为Java开发者提供了一种对象/关系映射工具来管理Java应用中的关系数据。JPA是Java EE和Java SE环境中持久化数据的标准方式...
Java 持续性API(JPA)是Java平台上的一个规范,用于处理对象关系映射(ORM),它简化了企业级Java应用中对数据库的访问。JPA允许开发者使用面向对象的编程模型来操作数据库,而无需深入理解底层的SQL语法。在JPA中...
JPA允许我们定义对象-关系映射(ORM),使得我们可以用面向对象的方式来处理数据库数据。本资料主要探讨的是JPA中的一对多关系以及延迟加载机制,这两部分是JPA使用中的关键概念。 **一对多关系** 在关系数据库中...
日期_枚举等字段类型的JPA映射** JPA提供了对不同数据类型的映射,如日期类型(@Temporal),枚举类型(@Enumerated),甚至自定义类型,通过Converter接口可以自定义数据类型转换。 **6. 大数据字段映射与字段...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它是Java EE和Java SE环境中对象关系映射(ORM)的一部分。JPA通过提供API和元数据来描述如何将Java对象映射到数据库表,使得...
1. `@Entity`:标记一个类作为JPA的实体类,使得该类可以被JPA管理并映射到数据库表。 2. `@Table`:指定实体类对应的数据库表名。 3. `@Id`:标识实体类中的主键字段。 4. `@ManyToMany`:用于表示多对多关联。 5. ...