【问题标题】:Spring Data JDBC cascade creationSpring Data JDBC级联创建
【发布时间】:2021-12-01 11:26:10
【问题描述】:

是否可以像在 Spring Data JPA 中一样在 Spring Data Jdbc 中为 OneToMany 和 ManyToMany 关系级联创建?如果不是,那么策略是什么?

@Table("orders")
public class Order {
        
    @Id private UUID id;
        
    @MappedCollection(idColumn = "order_id")
    private Set<OrderItem> orderItems = new HashSet<>();
        
    private LocalDateTime lastModifiedDateTime;
        
    public Order() {}
}
@Table("orders_items")
public class OrderItem {
    
    private UUID productId;
    private Integer quantity;
    
    @Transient private Product product;
    
    public OrderItem(Product product, Integer quantity) {
        this.productId = product.getId();
        this.quantity = quantity;
    }
}
@Table("products")
public class Product {
    
    @Id private UUID id;
    private String title;
    private String description;
    private BigDecimal price;
    private LocalDateTime lastModifiedDateTime;
    
    public Product(String title, String description, BigDecimal price) {
        this.id = id;
        this.title = title;
        this.description = description;
        this.price = price;
    }
}

【问题讨论】:

    标签: spring-boot spring-data-jdbc


    【解决方案1】:

    是否可以在 Spring Data JDBC[..] 中进行级联创建?

    是和不是。

    Spring Data JDBC 基于聚合的概念。 聚合是紧密相关的对象集群,只要您不在该聚合的方法中,它们就保持一致。 聚合中的所有对象都被持久化(并加载)在一起。

    从聚合的根对象可到达的所有内容都被视为聚合的一部分。

    因此,在您的情况下,OrderOrderItem 之间形成了一个聚合,您在某种意义上确实得到了“级联”。

    Product 是一个单独的聚合,这是正确的。因此你不会得到级联。

    如果不是,那么策略是什么?

    有两种情况:

    1. 如果 id 是在持久化过程中生成的,无论是由数据库还是由某个事件侦听器生成,只需按正确的顺序持久化内容即可。在这种情况下,请先保留 Product,然后再保留引用它的 Order。 这应该变得非常明显,因为在持久化 Product 之前 id 是 null 并且您需要从 Order 引用它。

    2. 如果 id 是在对象的构造过程中生成的,那么只要数据库限制允许,您可以按您喜欢的任何顺序持久化聚合。您可能需要为此研究延迟约束。

    Here you can read more about aggregates in Spring Data JDBC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 2018-01-02
      • 2023-02-23
      • 1970-01-01
      • 2020-05-21
      相关资源
      最近更新 更多