Spring Data Rest JPA - 无法延迟加载OneToMany双向关系

7
我有两个实体,Company和Job,它们之间存在着OneToMany的双向关系。我的问题是我无法使用lazy load来加载Company的List 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() {
    }

    ...

}

作为您所看到的,在其他一对多关系中(员工),同样的事情也会发生。我能否避免每次返回整个职位空缺或员工列表?
编辑:从职位方面来看,延迟加载工作正常!我不会在响应中获得与职位相关的公司。我必须明确执行“/api/jobs/123/company”,以便获取公司。
编辑2:投影仅适用于集合。在这种情况下,这不是我需要的。摘录可能有效,但我想避免它们。我不想明确执行“/api/companies/1?projection=MyProjection”,因为我不会使用更多。我想改变默认行为,就像投影在集合中所做的那样。
编辑3:我尝试过这个。
@RestResource(exported = false)
@OneToMany(mappedBy = "company")
private List<Job> jobs;

我收到了错误信息:检测到多个关联链接具有相同的关系类型!澄清关联

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


这不是关于JPA的问题,而是一个关于Company中的集合是否应该被序列化的问题。即使关系只是普通的POJO而非映射到持久化对象,这也将是同样的问题。 - wrschneider
1
在这种情况下,@RestResource(exported = false)@JsonIgnore 应该足以隐藏 jobs 字段(请参见此处)。 - David Riccitelli
@DavidRiccitelli 但我需要它们被导出。我只需要惰性加载它们,这样当我执行“/api/companies/1/jobs”时,我将只获取一个公司的职位。 - Christos Baziotis
1个回答

0

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

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

此外; enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接