假设我有这两个实体类:
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
List<Order> orderList;
/* getters and setters */
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@ManyToOne
private User user;
/* getters and setters */
}
这个存储库:
public interface OrderRepository extends CrudRepository<Order, Long> {
List<Order> findByUser(User user);
}
现在,如果我的user
是一个托管实体,并希望获得属于该user
的订单列表,我可以通过两种方式执行此操作:
方法1:
@Autowired
OrderRepository orderRepository;
List<Order> orderList = orderRepository.findByUser(user);
方法2:
List<Order> orderList = user.getOrderList();
这两种方法有什么区别吗?我何时应该使用方法1,何时应该使用方法2?
由于
答案 0 :(得分:0)
根据获取策略和延迟加载的确切配置,数据实际从数据库加载的时间和方式可能存在差异。但这并不是决定你决定使用哪种访问路径的原因。
Spring Data背后的一个非常核心的想法是Domain Driven Design中描述的聚合。每个聚合应该有一个存储库。所以问题就变成了:User
和Order
是同一聚合体的一部分吗?如果假设您遵守Spring Data背后的想法,那么User
和Order
的存储库意味着它们都是聚合根,因此不能成为其中的一部分骨料。此外,因此我不会使用该引用并实际删除它(我当然会删除Cascade.All
但是您显然没有根据该参数做出设计决策,因此您可能决定两者都应属于同一个Aggregate并删除其中一个存储库。