文章目录

  • 什么是DDD值对象?
  • 实现方式
  • 单一值对象
    • 改变表中映射的字段的名称
    • 根据值对象的单一属性查询或多属性的动态查询
  • 多个值对象
    • 根据值对象的单一属性查询或多属性的动态查询

什么是DDD值对象?

什么领域驱动设计(DDD) 值对象??

实现方式

利用JPA 中的@Embeddable@Embedded两个注解来实现值对象的持久化

单一值对象

单一对象可以利用嵌入的方式将值对象的属性映射到实体类,将值对象的属性 映射成表的字段 。

录入学生信息时,需要一个家庭住址的信息,则这个地址信息则可以设计成一个值对象AddressModel

import lombok.Data;import javax.persistence.Embeddable;/*** @author peter* date 2020/11/12 17:03*/
@Data
@Embeddable
public class AddressModel {private String city;private String street;private Long lng;private Long lat;
}

学生Student

import lombok.Data;import javax.persistence.*;/*** @author peter* date 2020/11/12 17:08*/
@Entity
@Data
public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Embeddedprivate AddressModel homeAddress;//省略其他信息....
}
在数据库中`student`表结构

改变表中映射的字段的名称

利用@AttributeOverride注解来修改映射字段在数据库表的字段名称

    @Embedded@AttributeOverrides({@AttributeOverride(name = "city",column = @Column(name = "address_city")),@AttributeOverride(name = "street",column = @Column(name = "address_street")),@AttributeOverride(name = "lng",column = @Column(name = "address_lng")),@AttributeOverride(name = "lat",column = @Column(name = "address_lat")),})private AddressModel homeAddress;

根据值对象的单一属性查询或多属性的动态查询

import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.util.StringUtils;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;/*** @author peter* date 2020/11/12 17:11*/
public interface StudentRepository extends JpaRepository<Student, Long>, JpaSpecificationExecutor<Student> {/*** 根据地址中的 city 来查询** @param city* @return*/List<Student> findByHomeAddress_City(String city);/*** 根据city、street 来动态查询* @param city* @param street* @return*/default List<Student> query(String city, String street) {Specification<Student> specification = new Specification<Student>() {@Overridepublic Predicate toPredicate(Root<Student> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>();if (StringUtils.hasText(city)) {predicates.add(cb.equal(root.get(Student_.HOME_ADDRESS).get("city"), city));}if (StringUtils.hasText(street)) {predicates.add(cb.equal(root.get(Student_.HOME_ADDRESS).get("street"), street));}return cb.and(predicates.toArray(new Predicate[0]));}};return findAll(specification);}
}

多个值对象

利用 @ElementCollection 注解来实现持久化,在数据库会自动创建一个单独用于保存值对象数据的表,当实体类被删除时,自动删除对应的值对象的数据。

老师Teacher

import lombok.Data;import javax.persistence.*;
import java.util.Set;/*** @author peter* date 2020/11/12 18:15*/
@Data
@Entity
public class Teacher {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ElementCollectionprivate Set<AddressModel> homeAddresses;//省略其他信息....
}
 数据库中值对象表结构

根据值对象的单一属性查询或多属性的动态查询

import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.util.StringUtils;import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List;/*** @author peter* date 2020/11/12 18:30*/
public interface TeacherRepository extends JpaRepository<Teacher,Long>, JpaSpecificationExecutor<Teacher> {/*** 根据地址中的 city 来查询** @param city* @return*/List<Teacher> findByHomeAddresses_City(String city);/*** 根据city、street 来动态查询** @param city* @param street* @return*/default List<Teacher> query(String city, String street) {Specification<Teacher> specification = new Specification<Teacher>() {@Overridepublic Predicate toPredicate(Root<Teacher> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>();SetJoin<Teacher, AddressModel> addressModelSetJoin = root.joinSet(Teacher_.HOME_ADDRESSES);if (StringUtils.hasText(city)) {predicates.add(cb.equal(addressModelSetJoin.get("city"), city));}if (StringUtils.hasText(street)) {predicates.add(cb.equal(addressModelSetJoin.get("street"), street));}return cb.and(predicates.toArray(new Predicate[0]));}};return findAll(specification);}}

JPA实现领域驱动设计(DDD) 中值对象的持久化相关推荐

  1. 领域驱动设计战术模式--值对象

    值对象虽然经常被掩盖在实体的阴影之下,但它却是非常重要的 DDD 概念. 值对象不具有身份,它纯粹用于描述实体的特性.处理不具有身份的值对象是很容易的,尤其是不变性与可组合性是支持易用性的两个特征. ...

  2. 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

    这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...

  3. 分享我对领域驱动设计(DDD)的学习成果

    本文内容提要: 1. 领域驱动设计之领域模型 2. 为什么建立一个领域模型是重要的 3. 领域通用语言(Ubiquitous Language) 4. 将领域模型转换为代码实现的最佳实践 5. 领域建 ...

  4. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...

    昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...

  5. 领域驱动设计 (DDD)实例分析

    本文结合实例来分析下领域驱动设计 (DDD) 文章目录 啥是DDD 啥是驱动 DDD误解 啥时候用 啥是复杂 具体解决啥 为啥会耦合 咋解决耦合 咋做分治 咋做分界 模块 分层 咋落地 本文小结 啥是 ...

  6. 领域驱动设计DDD之读书笔记

    查看文章   领域驱动设计DDD之读书笔记  转载原地址:http://hi.baidu.com/lijiangzj 2007-08-17 16:53 一.当前Java软件开发中几种认识误区 Hibe ...

  7. 领域驱动设计(DDD)实践之路(三):如何设计聚合

    本文首发于 vivo互联网技术 微信公众号  链接:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q 作者:wenbo zhang [领域驱动设计实践 ...

  8. 领域驱动设计(DDD)-基础思想

    一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...

  9. 领域驱动设计 DDD

    一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...

最新文章

  1. 【每日一算法】爬楼梯
  2. nginx_gzip压缩提升网站的传输速度
  3. PHP+ExtJS 文件上传示例
  4. Qt6.2.1使用clang格式化代码
  5. java 8 删选集合 和取集合中的字段重组成集合的使用
  6. JVM原理探究及调优方法论
  7. axure原型案例_Axure RP9原型案例:制作一个可以滑动的菜单
  8. 网络编程函数小总结与初识socket
  9. 获取笔记本序列号(SN码)命令
  10. 价值连城 Apple研究院总监 Ruslan Salakhutdinov的采访 给AI 深度学习从业者的建议
  11. 不同行业的软件都爱用什么编程语言开发?
  12. 教你分割视频,用多个视频随机合并,添加音频
  13. 2003服务器u盘不显示不出来,U盘文件不显示三种解决方法
  14. 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真
  15. GO语言数据结构之队列
  16. 常见的ICE工具和集成开发环境
  17. HTML图片的路径问题
  18. 找回你的xournal++未保存文档
  19. 用css,html,js搭建一个书店购物系统
  20. EXCEL 强大的数据分析工具

热门文章

  1. 上传文件到到大数据平台
  2. android图片:多选相册的实现
  3. win10 开热点 【服务主机:网络服务】 疯狂跑流量的解决方案 亲测有效!!!!
  4. excel合并sheet表格
  5. win7突然提示“windows无法连接到xxx”、thinkpad键盘触摸板失效解决
  6. 南京大学2020计算机考研分数线,2020年南京大学考研分数线公布
  7. w7计算机摄像头怎么打开,如何打开摄像头,详细教您Win7摄像头怎么打开
  8. 工作疑问之windows EFS加密后重装系统
  9. 九度1088——剩下的树
  10. 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)