通过getter和via repository获取对象之间的区别

时间:2017-04-09 15:01:18

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

假设我有这两个实体类:

@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?

由于

1 个答案:

答案 0 :(得分:0)

根据获取策略和延迟加载的确切配置,数据实际从数据库加载的时间和方式可能存在差异。但这并不是决定你决定使用哪种访问路径的原因。

Spring Data背后的一个非常核心的想法是Domain Driven Design中描述的聚合。每个聚合应该有一个存储库。所以问题就变成了:UserOrder是同一聚合体的一部分吗?如果假设您遵守Spring Data背后的想法,那么UserOrder的存储库意味着它们都是聚合根,因此不能成为其中的一部分骨料。此外,因此我不会使用该引用并实际删除它(我当然会删除Cascade.All

但是您显然没有根据该参数做出设计决策,因此您可能决定两者都应属于同一个Aggregate并删除其中一个存储库。