JPA实现领域驱动设计(DDD) 中值对象的持久化
文章目录
- 什么是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) 中值对象的持久化相关推荐
- 领域驱动设计战术模式--值对象
值对象虽然经常被掩盖在实体的阴影之下,但它却是非常重要的 DDD 概念. 值对象不具有身份,它纯粹用于描述实体的特性.处理不具有身份的值对象是很容易的,尤其是不变性与可组合性是支持易用性的两个特征. ...
- 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用
这是"领域驱动设计实践之路"系列的第四篇文章,从单体架构的弊端引入微服务,结合领域驱动的概念介绍了如何做微服务划分.设计领域模型并展示了整体的微服务化的系统架构设计.结合分层架构. ...
- 分享我对领域驱动设计(DDD)的学习成果
本文内容提要: 1. 领域驱动设计之领域模型 2. 为什么建立一个领域模型是重要的 3. 领域通用语言(Ubiquitous Language) 4. 将领域模型转换为代码实现的最佳实践 5. 领域建 ...
- python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...
- 领域驱动设计 (DDD)实例分析
本文结合实例来分析下领域驱动设计 (DDD) 文章目录 啥是DDD 啥是驱动 DDD误解 啥时候用 啥是复杂 具体解决啥 为啥会耦合 咋解决耦合 咋做分治 咋做分界 模块 分层 咋落地 本文小结 啥是 ...
- 领域驱动设计DDD之读书笔记
查看文章 领域驱动设计DDD之读书笔记 转载原地址:http://hi.baidu.com/lijiangzj 2007-08-17 16:53 一.当前Java软件开发中几种认识误区 Hibe ...
- 领域驱动设计(DDD)实践之路(三):如何设计聚合
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q 作者:wenbo zhang [领域驱动设计实践 ...
- 领域驱动设计(DDD)-基础思想
一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...
- 领域驱动设计 DDD
一.序言 领域驱动设计是一种解决业务复杂性的设计思想,不是一种标准规则的解决方法.在领域驱动设计理念上,各路大侠的观点也是各有不同,能力有限.欢迎留言讨论. 二.领域驱动设计 DDD是什么 wiki释 ...
最新文章
- 【每日一算法】爬楼梯
- nginx_gzip压缩提升网站的传输速度
- PHP+ExtJS 文件上传示例
- Qt6.2.1使用clang格式化代码
- java 8 删选集合 和取集合中的字段重组成集合的使用
- JVM原理探究及调优方法论
- axure原型案例_Axure RP9原型案例:制作一个可以滑动的菜单
- 网络编程函数小总结与初识socket
- 获取笔记本序列号(SN码)命令
- 价值连城 Apple研究院总监 Ruslan Salakhutdinov的采访 给AI 深度学习从业者的建议
- 不同行业的软件都爱用什么编程语言开发?
- 教你分割视频,用多个视频随机合并,添加音频
- 2003服务器u盘不显示不出来,U盘文件不显示三种解决方法
- 2017年全国大学生电子设计竞赛综合测评题目解析——Multisim仿真
- GO语言数据结构之队列
- 常见的ICE工具和集成开发环境
- HTML图片的路径问题
- 找回你的xournal++未保存文档
- 用css,html,js搭建一个书店购物系统
- EXCEL 强大的数据分析工具
热门文章
- 上传文件到到大数据平台
- android图片:多选相册的实现
- win10 开热点 【服务主机:网络服务】 疯狂跑流量的解决方案 亲测有效!!!!
- excel合并sheet表格
- win7突然提示“windows无法连接到xxx”、thinkpad键盘触摸板失效解决
- 南京大学2020计算机考研分数线,2020年南京大学考研分数线公布
- w7计算机摄像头怎么打开,如何打开摄像头,详细教您Win7摄像头怎么打开
- 工作疑问之windows EFS加密后重装系统
- 九度1088——剩下的树
- 21天学习之二(Android 10.0 SystemUI默认去掉底部导航栏的三种方法)