保存并阅读非聚合根

时间:2017-08-07 08:51:49

标签: spring spring-data spring-data-jpa

我是Spring数据jpa的初学者。我从文档中了解到,我们只为聚合根创建了存储库。例如,对象订单封装了多个 LineItem 对象的操作。 订单包含 LineItem 对象。所以订单是聚合根,将为其创建存储库。

我们可以使用存储库方法轻松保存,阅读订单对象:

OrderRepository.save(order)
OrderRepository.findAll

我的问题是,如果我想在订单对象之前创建 Lineitem 对象以将它们存储在组合框中,如果我不能保存它们怎么能保存它们?为他们创建存储库?

或者,如果我只想显示 Lineitems 列表,我该如何阅读这些对象?

2 个答案:

答案 0 :(得分:0)

假设我们有一个模型:

@Entity
public class Order {
    @Id
    private Long id;    

    @OneToMany(cascade = ALL, orphanRemoval = true)
    private List<Item> items = new ArrayList();    

    public Order(Item... items) {

        items.addAll(Arrays.asList(items)  ;
    }

    //...
}

@Entity
public class Item {
    @Id
    private Long id;

    //...
}

要保存属于订单的商品,请执行以下操作:

Item item1 = new Item();
Item item2 = new Item();
Order order = new Order(item1, item2);
orderRepo.save(order);

由于我们将cascade = ALL用于items,因此它们将与订单一起保存。 这同样适用于其他操作:更新,删除......

<强>更新

如果模型假定与实体独立工作(例如:项目类别列表),那么我们应该为它们创建一个存储库,允许我们将实体与其他AR分开存储。

public interface ItemRepo extends JpaRepository<Item, Long> {
}

Item item1 = new Item();
Item item2 = new Item();
itemRepo.save(asList(item1, item2);
Order order = new Order(item1, item2);
orderRepo.save(order);

但我认为这不是订单商品的最佳选择,因为没有订单就无法生存。

答案 1 :(得分:0)

如果您在订单之前存在物品,则这意味着只有一件事:订单和物品是两个不同的聚合根,因此它们可以以不同的方式处理。所以这解决了你的问题:你需要两个存储库,一个用于订单,一个用于项目。在处理订单内的项目的每个其他上下文中,formrrs在latters之前不能存在。 无论如何,这需要在保存方面做一些工作,因为如果添加/删除了项目,您将检查每个订单。