【问题标题】:Spring Data Rest JPA - Can't lazy load OneToMany bidirectional relationshipSpring Data Rest JPA - 不能延迟加载 OneToMany 双向关系
【发布时间】:2016-01-09 03:15:36
【问题描述】:

我有两个实体,Company 和 Job,具有 OneToMany 双向关系。我的问题是我不能延迟加载公司的List<Job> jobs

例如当我这样做时:

GET /api/companies/1 这是 JSON 响应:

{
  "id": 1,
  "name": "foo",
  ...
  "_embedded": {
    "jobs": [
      {...},
       ...
      {...}
    ],
    "employees": [
      {...},
      {...}
    ]
  },
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/companies/1"
    },
    "jobs": {
      "href": "http://localhost:8080/api/companies/1/jobs"
    },
    "employees": {
      "href": "http://localhost:8080/api/companies/1/employees"
    }
  }
}

我不想拥有_embedded,因为我没有设置 FetchType=EAGER。 这是我的模型:

Company.java

@Entity
public class Company {

    @Column(nullable = false, unique = true)
    private String name;


    @OneToMany(mappedBy = "company", fetch = FetchType.LAZY)
    private List<Job> jobs;

    ...

    public Company() {
    }

    ...

}

Job.java

@Entity
public class Job {

    @Column(nullable = false)
    public String title;

    @Column(length = 10000)
    public String description;

    @ManyToOne(fetch=FetchType.LAZY)
    private Company company;

    ...

    public Job() {
    }

    ...

}

正如您所见,其他 OneToMany 关系(员工)也会发生同样的事情。我可以避免每次都返回整个职位空缺或员工列表吗?

编辑:从工作方面来看,延迟加载工作正常!我没有得到与工作相关的公司的回复。为了得到公司,我必须明确地做/api/jobs/123/company

EDIT2:投影仅适用于集合。在这种情况下,这不是我需要的。摘录可以工作,但我想避免它们。我不想明确地做/api/companies/1?projection=MyProjection,因为我不会使用多个。我想更改默认行为,就像在集合中的投影一样。

EDIT3:我试过这个

@RestResource(exported = false)
@OneToMany(mappedBy = "company")
private List<Job> jobs;

我收到错误Detected multiple association links with same relation type! Disambiguate association

真的很烦人。我只需要摆脱_embedded。有什么事吗?

【问题讨论】:

  • 这其实不是JPA的问题,而是Company中的集合是否应该序列化的问题。如果关系只是 POJO 没有映射到持久对象,那将是同样的问题。
  • 在这种情况下,jobs 字段上的@RestResource(exported = false)@JsonIgnore 就足够了(请参阅here)。
  • @DavidRiccitelli 但我需要将它们导出。我只需要延迟加载它们,所以只有当我做/api/companies/1/jobs时我才会得到公司的工作。

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


【解决方案1】:

您可以使用实体图。实体图用于在运行时覆盖属性映射的获取设置。例如

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

  @EntityGraph(attributePaths = { "members" })
  GroupInfo getByGroupName(String name);

}

来自 Spring Data Jpa 文档“4.3.10. 配置 Fetch- 和 LoadGraphs” https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

另外;

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2013-11-02
    • 2022-09-29
    相关资源
    最近更新 更多