我是Spring数据jpa的初学者。我从文档中了解到,我们只为聚合根创建了存储库。例如,对象订单封装了多个 LineItem 对象的操作。 订单包含 LineItem 对象。所以订单是聚合根,将为其创建存储库。
我们可以使用存储库方法轻松保存,阅读订单对象:
OrderRepository.save(order)
OrderRepository.findAll
我的问题是,如果我想在订单对象之前创建 Lineitem 对象以将它们存储在组合框中,如果我不能保存它们怎么能保存它们?为他们创建存储库?
或者,如果我只想显示 Lineitems 列表,我该如何阅读这些对象?
答案 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之前不能存在。 无论如何,这需要在保存方面做一些工作,因为如果添加/删除了项目,您将检查每个订单。