想用好 DDD 必须先过 Spring Data 这关( 五 )


// createOrder 方法中 repository.save(order) 产生的 SQL: // 创建带有地址的订单 Hibernate: insert into tb_order_address (detail) values (?) Hibernate: insert into tb_order (user_address_id, price, status, user_id) values (?, ?, ?, ?) Hibernate: insert into tb_order_item (amount, price, product_id, product_name, status) values (?, ?, ?, ?, ?) Hibernate: insert into tb_order_item (amount, price, product_id, product_name, status) values (?, ?, ?, ?, ?) Hibernate: insert into tb_order_item (amount, price, product_id, product_name, status) values (?, ?, ?, ?, ?) Hibernate: insert into tb_order_item (amount, price, product_id, product_name, status) values (?, ?, ?, ?, ?) Hibernate: insert into tb_order_item (amount, price, product_id, product_name, status) values (?, ?, ?, ?, ?) Hibernate: update tb_order_item set order_id=? where id=? Hibernate: update tb_order_item set order_id=? where id=? Hibernate: update tb_order_item set order_id=? where id=? Hibernate: update tb_order_item set order_id=? where id=? Hibernate: update tb_order_item set order_id=? where id=? // paySuccess 方法中 repository.findById(orderId) 产生的 SQL // 从 DB 中加载数据 , 构建内存的 Order 对象 Hibernate: select order0_.id as id1_0_0_, order0_.user_address_id as user_add5_0_0_, order0_.price as price2_0_0_, order0_.status as status3_0_0_, order0_.user_id as user_id4_0_0_ from tb_order order0_ where order0_.id=? // 访问 order.items , 触发自动加载 Hibernate: select items0_.order_id as order_id7_2_0_, items0_.id as id1_2_0_, items0_.id as id1_2_1_, items0_.amount as amount2_2_1_, items0_.price as price3_2_1_, items0_.product_id as product_4_2_1_, items0_.product_name as product_5_2_1_, items0_.status as status6_2_1_ from tb_order_item items0_ where items0_.order_id=? // paySuccess 方法中 this.repository.save(order) 产生的 SQL // 将 Order 变更更新到数据库 Hibernate: update tb_order set user_address_id=?, price=?, status=?, user_id=? where id=? // 将 OrderItem 变更更新到数据库 Hibernate: update tb_order_item set amount=?, price=?, product_id=?, product_name=?, status=? where id=? Hibernate: update tb_order_item set amount=?, price=?, product_id=?, product_name=?, status=? where id=? Hibernate: update tb_order_item set amount=?, price=?, product_id=?, product_name=?, status=? where id=? Hibernate: update tb_order_item set amount=?, price=?, product_id=?, product_name=?, status=? where id=? Hibernate: update tb_order_item set amount=?, price=?, product_id=?, product_name=?, status=? where id=? // repository.findById(order.getId()) 产生的 SQL // 从 DB 中加载数据 , 构建内存的 Order 对象 , 进行结果检测 Hibernate: select order0_.id as id1_0_0_, order0_.user_address_id as user_add5_0_0_, order0_.price as price2_0_0_, order0_.status as status3_0_0_, order0_.user_id as user_id4_0_0_ from tb_order order0_ where order0_.id=?
从 SQL 中可见 , 在复杂的 一对多 场景 , 懒加载 和 自动同步能力 仍旧有效 。
 

从代码上可以清晰得出:在 Spring Data Jpa 的助力下 , 无需编写任何数据层访问代码 , 便可以完成领域对象的管理 。
6. 小结 
DDD 和 Jpa 都是面向对象设计的巅峰之作 , 两者结合威力巨大 。
结合使用 DDD 和 JPA 可以有效地将领域模型与数据库持久化技术相结合 。开发人员可以使用领域驱动的方法管理数据 , 并通过 JPA 将数据存储在数据库中 , 从而避免冗长的数据持久化代码 。
此外 , 使用 DDD 和 JPA 还有其他优势:
提高代码可读性:领域驱动的设计方法可以帮助开发人员更清晰地了解领域模型 , 使代码更易于阅读和维护 。
减少代码量:使用 JPA 可以减少代码量 , 因为开发人员不需要编写手动的数据持久化代码 。
提高代码的可重用性:通过使用领域模型 , 开发人员可以创建一组可重用的实体 , 并在多个地方使用它们 。
提高代码的可扩展性:使用 DDD 和 JPA 可以使代码更易于扩展 , 因为它们遵循领域驱动的设计方法 。
总之 , 使用 DDD 和 JPA 可以帮助开发人员更有效地解决业务问题 , 提高代码的可读性 , 可重用性和可扩展性 , 并减少代码量 。

【想用好 DDD 必须先过 Spring Data 这关】


推荐阅读