1、场景一:地址信息(省、市、县、详细地址)在很多实体中都需要,比如说作者有地址,订单也有地址,但是他们的地址并不能独立与他们存在,所以地址不能映射为实体,
那么我们就需要在作者实体和订单实体中都添加这些地址信息。这时如果我们想要在地址信息中添加一个邮编,就需要在每一个用到地址的实体中都添加邮编字段,很是繁
琐。面向对象编程的做法是,我们将地址信息封装到一个对象中,然后需要地址信息的实体如引用这个对象。直接这样做的话,如果地址类不实现Serializable接口,启动
报错,实现了后,会把地址对象映射为二进制的数据库tinyblob字段,这显然不是我们想要的,什么好办法进行处理呢? JPA为我们提供了一组注解,来解决这个问题,@Embeddable/@Embedded。
@Embeddable:指定一个类,该类的实例存储为所属实体的固有部分并共享该实体的标识。嵌入对象的每个持久属性或字段都映射到实体的数据库表。
@Embedded:指定其值为可嵌入类的实例的实体的持久字段或属性。可嵌入类必须被注释为可嵌入的。 在被@Embeddable标记的可嵌入类中的字段,也可以使用JPA的注解来进行设置。
可以通过 @AttributeOverrides和@AttributeOverride来修改@Embedded标记的嵌入对象字段在本实体表中的映射字段名称,修改后原有可嵌入对象中的字段设置失效。
多重嵌套用"."进行连接。 注意:被引用对象和引用对象具有相同的生命周期时,才考虑使用内嵌对象。 可嵌入地址类:
/**
* 地址对象
*
* @author caofanqi
*/
@Data
@Builder
@Embeddable
@NoArgsConstructor
@AllArgsConstructor
public class Address { private String province; private String city; private String county; /**
* 可嵌入对象中的字段也可以使用@Column进行修饰
*/
@Column(nullable = false)
private String detailedAddress; private String zipCode; }

作者实体中:

/**
* 作者实体
*
* @author caofanqi
*/
@Data
@Entity
@Builder
@Table(name = "jpa_author")
@NoArgsConstructor
@AllArgsConstructor
public class Author { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private String authorName; @Embedded
@AttributeOverrides({
@AttributeOverride(name = "detailedAddress",column = @Column(name = "addr_detailed")),
@AttributeOverride(name = "zipCode",column = @Column(name = "addr_zip"))
})
private Address address; }

2、场景二:作者有多个昵称我们要怎么映射呢?
JPA为我们提供了@ElementCollection,指定基本类型或可嵌入类的实例集合。如果要通过集合表映射集合,则必须指定。
属性 targetClass:集合指定了泛型可选,否者必须指定。必须是基本类型或可嵌入类型。
属性 fetch:数据抓取策略。默认延迟加载。
会为我们创建一张中间表,默认命名主实体 + "_" + 集合属性名称,默认外键名称,主实体类名 + "_" + 主实体主键。 如果我们想要进行修改设置,可以使用@CollectionTable注解进行设置。 注意,一般我们会直接在主实体中使用一个字段进行存放,存取的时候自己做一下处理(比如说逗号隔开的字符串),这样就不用多产生一张表了。 作者实体中:
/**
* 作者实体
*
* @author caofanqi
*/
@Data
@Entity
@Builder
@Table(name = "jpa_author")
@NoArgsConstructor
@AllArgsConstructor
public class Author { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private String authorName; /**
* @ElementCollection 映射基本类型和可嵌入类型集合,可以使用@CollectionTable 指定额外产生表的名称,外键名称等。
*/
@ElementCollection
@CollectionTable(name = "jpa_author_nick",joinColumns = {@JoinColumn(name = "a_id",referencedColumnName = "id")})
private Set<String> nickName; }

3、场景三:如果作者有多个地址呢,比如说家庭地址,工作地址等,我们应该怎么办呢?
我们可以将上面两种场景结合起来使用,将可嵌入的地址对象放到一个Map<String,Address> 中,这样生成的集合表就会将
主实体id和map的key作为集合表的联合主键。
同样我们可以使用@CollectionTable对集合表进行设置,使用@AttributeOverrides和@AttributeOverride设置数据库字段名称,
只不过要添加前缀value.。
可以使用@MapKeyColumn指定map的key在集合表中的列名,和其他一些设置,同@Column。默认列名是属性字段 + "_key"。 作者实体:
/**
* 作者实体
*
* @author caofanqi
*/
@Data
@Entity
@Builder
@Table(name = "jpa_author")
@NoArgsConstructor
@AllArgsConstructor
public class Author { @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private String authorName; /**
* 一个作者有多个地址
*/
@ElementCollection
@MapKeyColumn(name = "addr_key")
@CollectionTable(name = "jpa_author_address")
@AttributeOverrides({
@AttributeOverride(name = "value.detailedAddress",column = @Column(name = "addr_detailed")),
@AttributeOverride(name = "value.zipCode",column = @Column(name = "addr_zip"))
}) private Map<String,Address> addresses; }

  对应生成的表

    

    

源码地址:https://github.com/caofanqi/study-spring-data-jpa
												

学习Spring-Data-Jpa(五)---可嵌入对象和元素集合的使用的更多相关文章

  1. 学习Spring Data JPA

    简介 Spring Data 是spring的一个子项目,在官网上是这样解释的: Spring Data 是为数据访问提供一种熟悉且一致的基于Spring的编程模型,同时仍然保留底层数据存储的特​​殊 ...

  2. Spring Data Jpa (五)@Entity实例里面常用注解详解

    详细介绍javax.persistence下面的Entity中常用的注解. 虽然Spring Data JPA已经帮我们对数据的操作封装得很好了,约定大于配置思想,帮我们默认了很多东西.JPA(Jav ...

  3. 学习-spring data jpa

    spring data jpa对照表 Keyword Sample JPQL snippet And findByLastnameAndFirstname - where x.lastname = ? ...

  4. Spring Data Jpa 查询返回自定义对象

    转载请注明出处:http://www.wangyongkui.com/java-jpa-query. 今天使用Jpa遇到一个问题,发现查询多个字段时返回对象不能自动转换成自定义对象.代码如下: //U ...

  5. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  6. 使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  8. JAVA入门[20]-Spring Data JPA简单示例

    Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建.事务处理等 JPA 相关的处理.Spring Data JPA更是 ...

  9. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

随机推荐

  1. Asp.net Core CORS 跨域

    本文主要介绍在Asp.net Core采用CORS方式解决跨域 关于跨域的原理介绍可参考Asp.net Web API 解决跨域详解 1 在Startup添加允许跨域的策略 services.AddC ...

  2. AX导出excel设置格式

    今天在AX2009里面写一个导出EXCEL,没有模版,这是第一次碰到,之后写完之后发现导出的数据格式不对. 到处取经之后得到一下结果: 定义一个 Com   range; SysExcelCells  ...

  3. ByteArray、16进制、字符串之间的转换

    ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...

  4. mysq 连表更新

    update table1 a left join table2 b on a.id = b.user_id left join table3 c on a.id = c.user_idset a.p ...

  5. JSOI2019 Round2

    JSOI的题质量很高-- 精准预测(2-SAT.拓扑排序.bitset) 不难发现两个条件都可以用经典的2-SAT连边方式连边,考虑如何加入时间的限制.对于第\(x\)个人在\(t\)时刻的状态是生/ ...

  6. Self-paced Clustering Ensemble自步聚类集成论文笔记

    Self-paced Clustering Ensemble自步聚类集成论文笔记 2019-06-23 22:20:40 zpainter 阅读数 174  收藏 更多 分类专栏: 论文   版权声明 ...

  7. Linux守护进程编写指南

    Linux守护进程编写指南 守护进程(Daemon)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种很有用的进 程.Linux的大多数服务器 ...

  8. treeMultiselect 去掉勾选项

    场景描述:弹窗,显示树形结构,节点层次可变(可只有一级节点,也可是多级节点),限制只能选择一个节点! 1.修改jquery.tree-multiselect.min.js 文件 2.前台页面 参考代码 ...

  9. bat批处理删除多少天前的文件

    @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除. ::本例需要Win2003/Vist ...

  10. PKPM BIMViewer的使用

    模型的使用,目前有两个方案, 一个是使用全局组件,在单页面的主页面中进行嵌套 <template> <div id="model"> <!-- 这样的 ...