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 对包含值类型的集合映射支持非标准的注解. 对于值类型的对象不具备数据库的同一性,它属于一个实体的实例,值类型的类没有标识符或者标识属性,值类型的实例的生命周期由所依附的实体实例的生命周期所决定,且值类型的对象不支持共享引用。
相关推荐
JPA2.0 加入了大量必须的 ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0...
这个项目包括5个实体,这5个实体之间具有复杂的关联关系,而且业务逻辑也相对复杂,希望让读者理论联系实际,真正将jsf+ejb 3+jpa整合真正运用到实际开发中。该案例采用目前最流行、最规范的java ee架构,整个应用...
描述 如果将用于对象关系映射,则JPA处理器应填补与数据库之间的空白。 在当前状态下,JPA处理器提供以下支持: 从JPA元数据生成OData元数据。 通过将Get请求转换为Criteria Builder查询来处理它们。 支持实体操纵。...
查找映射集合的大小,而不必加载集合中的所有元素 多个EntityManager 在单个应用程序中使用多个EntityManager 手动标识符生成 手动生成实体标识符 和 JTA交易 使用Bitronix支持跨多个数据存储的JTA事务 带有...
第6章 映射集合和实体关联 6.1 值类型的set、bag、list和map 6.1.1 选择集合接口 6.1.2 映射set 6.1.3 映射标识符bag 6.1.4 映射list 6.1.5 映射map 6.1.6 排序集合和有序集合 6.2 ...
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的...
非常适合初学者 ... ---------------------------------------------- ...命名查询、本地查询、一对多映射、一对一映射、开放JPA、分页结果集合 主关键词、查询参数、结果映射、保存、二级表、自联接 ... ... 太多知识点了
正则表达式 lucene索引合并 探查Weblogic JDBC Multipool 问题 struts通用Exception处理 ... JDOM和数据库 DB封装 菜鸟编程那点事 JPA中的集合查询示例 EL表达式 彩金狮王I代46倍
JFleet是一个Java库,它使用每个数据库提供程序中的最佳可用技术,以最快的速度持久保存在Java POJO的大型数据库集合中,并使用每个JDBC驱动程序实现中的替代持久性方法来实现它。 它的目标是使用可用的批处理持久...
集合 迭代器 馆藏 IO流 多线程 线程的创造 线程的生命周期 线程的同步 死锁 新特性 网络编程 网络通信协议 TCP协议与UDP协议 数据库 关系型数据库 MySQL SQL语句 DML,DCL,DDL 事物 索引 非关系型数据库 阶段二:...
理解数据库操作:通过与数据库的交互,了解SQL语言和ORM(对象关系映射)工具,如Hibernate或JPA。 提升前端技能:如果项目包含前端开发,可以学习如何使用HTML、CSS、JavaScript以及可能的前端框架如React或Angular...
java8集合源码库存数据访问层 该项目是“IBM 混合集成参考架构”解决方案的一部分,可在 . 该项目的目标是实施一组 SOA 服务操作来管理产品库存、供应商和库存。 这是故意的,我们将这三个组件集中在同一个应用程序...
Rest,Controller,事件监听,连接数据库MySQL,jpa,redis集成,mybatis集成(声明式与xml两种方式~对应的添删查改功能),日志处理,devtools配置,拦截器用法,资源配置读取,测试集成,Web层实现请求映射,...
集合和映射属性的类型声明 Java 类文字 另一个受益于这些分配的 SnakeYAML 用例是编写测试数据。 一种这样的场景是针对从 Yaml 文件而不是数据库填充的 JPA 类测试业务逻辑。 Maven 坐标 要在 Maven 项目中包含...
2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 ...
2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean创建 2.5.1 Bean范围化 2.5.2 利用工厂方法来创建Bean 2.5.3 ...
-> RDF映射器:对实际上由SPARQL支持的Java类运行JPA标准查询。 该库提供了几种与兼容的方法,可以在发送原始SPARQL查询之前透明地添加延迟,缓存,分页,重试甚至查询转换。 这使您的应用程序层摆脱了处理这些问题...
基于springboot 2.0.6.RELEASE版本实现的代码演示集合,欢迎使用star / fork 新子项目列表 介绍Springboot2【自动化单元测试】的用法: 如何编写测试案例,具体使用有哪些 单元测试场景:多种业务场景,例如如何进行...
课程在Java课程中学习的... 泛型,集合,映射; 函数式编程和lambda表达式; 使用JDBC和MySQL访问数据:从数据库中查询,插入,更改和删除数据; DAO:数据访问对象; JavaFX GUI; JPA; 冬眠Sprint Boot子; MongoD
2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁...