【发布时间】: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