【问题标题】:Spring Data Rest specify lazy loading for collectionsSpring Data Rest 为集合指定延迟加载
【发布时间】:2018-08-05 18:55:03
【问题描述】:

我有两个具有一对多关系的实体:

public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String phoneNumber;
    private Timestamp creationDate;
    @OneToMany(mappedBy = "user")
    private List<Role> roles;

}

public class Role {
    @Id
    @GeneratedValue
    private long id;
    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

}

但是当我调用 get 方法来加载用户信息时,我可以在日志文件中看到用于检索用户角色的附加查询也被调用。如何使用弹簧数据休息来防止它?

【问题讨论】:

  • 尝试将 fetchType 设置为 LAZY
  • 它不适用于 spring-data-rest 实体。 fetchType 默认也是惰性的。
  • 您必须展示的是如何检索和操作用户实体。作为提示,启用 SQL 日志,您可以查看是否第二次执行角色查询
  • 其实我发现show_sql属性的问题打开了,不过谢谢指教。

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


【解决方案1】:

由于您使用的是 SDR,为了防止在获取用户时加载角色,您可以:

1) 为角色创建存储库。如果您检查它是否已导出(@RepositoryRestResource(exported = true) - 默认情况下只需添加此注释而无需此参数)。

2) 或者让用户projection 没有角色:

@Projection(name = "justUser", types = User.class)
public interface JustUser {
    String getUsername();
    String getPhoneNumber();
    Timestamp getCreationDate();
}

然后在你的请求中使用它,像这样:

GET /users?projection=justUser

【讨论】:

    【解决方案2】:

    将 FetchType 定义为LAZY,如下所示。

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;
    

    默认情况下,ManyToOne 的 JPA fetchType 为 EAGER。参考here

    【讨论】:

    • 我尝试了这种方法,但没有奏效。实际上,我加载了所有用户(不是角色),所以不确定子实体的映射将如何解决这个问题......
    猜你喜欢
    • 2015-05-07
    • 2017-09-14
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 2013-11-02
    • 2022-09-29
    相关资源
    最近更新 更多