我有一个简单的spring数据休息示例项目,其中包含一个实体,该实体具有相同类型的子实体集合:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@OneToMany(cascade = CascadeType.ALL)
private List<Person> personList = new ArrayList<Person>();
private String name;
我也有一些简单的测试数据设置。 Person1有两个孩子:Child1和Child2。当我使用
访问Person1的REST资源时我得到了 - 正如所料:
{
"name" : "Person1",
"_links" : {
"self" : {
"href" : "http://localhost:8080/people/1"
},
"person" : {
"href" : "http://localhost:8080/people/1"
},
"personList" : {
"href" : "http://localhost:8080/people/1/personList"
}
}
}
然后我按照链接获取我的“personList”:
但遗憾的是,虽然我希望列表包含两个Person类型的元素,但是没有返回任何内容。
重要信息:我使用的是OpenJpa而不是Hibernate。在同一设置中使用Hibernate时,REST服务会返回预期的资源。
我还看了一下生成的SQL输出:Hibernate生成了两个SELECT语句
select person0_.id as id1_0_0_, person0_.name as name2_0_0_ from Person person0_ where person0_.id=?
select personlist0_.Person_id as Person_i1_0_0_, personlist0_.personList_id as personLi2_1_0_, person1_.id as id1_0_1_, person1_.name as name2_0_1_ from Person_Person personlist0_ inner join Person person1_ on personlist0_.personList_id=person1_.id where personlist0_.Person_id=?
而OpenJpa只发表一个声明。
SELECT t0.name FROM Person t0 WHERE t0.id = ? [params=?]
OpenJpa以某种方式解析了URI的“personList”部分。至少缺少对列表的查询。
有没有人知道如何使用Spring Data Rest和OpenJpa处理子集合?
我真的很感激任何帮助。 干杯克里斯
编辑:
如果我在子集合上使用 FetchType.EAGER ,则可以解析指向“personList”属性的链接。 OpenJpa在单个SQL语句中加入了孩子们。
SELECT t0.name, t1.PERSON_ID, t2.id, t2.name FROM Person t0 LEFT OUTER JOIN Person_Person t1 ON t0.id = t1.PERSON_ID LEFT OUTER JOIN Person t2 ON t1.PERSONLIST_ID = t2.id WHERE t0.id = ? ORDER BY t1.PERSON_ID ASC [params=?]
问题:我不想使用急切加载,因为最终对象可能变得非常大。