Spring Data Rest OpenJpa - 子集合不可用

时间:2016-07-13 15:34:37

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

我有一个简单的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资源时
  

http://localhost:8080/people/1

我得到了 - 正如所料:

{
  "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”:

  

http://localhost:8080/people/1/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=?]

问题:我不想使用急切加载,因为最终对象可能变得非常大。

0 个答案:

没有答案