在spring数据休息序列化时获取延迟对象

时间:2015-03-18 09:25:11

标签: json spring hibernate spring-data spring-data-rest

我有一个实体A,它有一些属性,并引用另一个实体B

A{
....
   @ManyToOne(fetch=FetchType.LAZY)
   B b;
...
}

对于B(B中的A的@onetomany)。它是一种双向关系。 在为实体A调用Web服务时,它提供了对B实体的链接,而不是响应json中的整个对象。 我希望Web服务响应JSON中的整个对象而不是链接到该相关实体。 我怎样才能做到这一点? 我使用springboot + spring数据jpa + hibernate作为jpa提供者+ spring 4

2 个答案:

答案 0 :(得分:5)

为了在输出JSON中嵌套相关对象,您必须使用projections

public class User {
   private String name;
   private Address address;
}

public class Address {
   private String street;
}

public interface UsersRepository extends JpaRepository<User, Long> {
   // Custom methods
}

会给你

{
   "name": "John",
   "_links": {
      "self": "http://localhost:8080/users/1",
      "address": "http://localhost:8080/addresses/1"
   }
}

但有投影:

@Projection(name = "inlineAddress", types = { User.class })
public interface UserInlineAddressProjection {
   String getName();
   Address getAddress();
}

@RepositoryRestResource(excerptProjection = UserInlineAddressProjection.class)
public interface UsersRepository extends JpaRepository<User, Long> {
   // Custom methods
}

结果将如下:

{
    "name": "John",
    "address": {
       "street": "Stormtroopers str. 1"
    },
    "_links": {
       "self": "http://localhost:8080/users/1",
       "address": "http://localhost:8080/addresses/1"
    }
}

这是实现它的唯一方法

答案 1 :(得分:0)

从您的问题中不清楚您在关系的一侧使用CollectionOneToMany中的“许多”)。

有两种方法可以实现这一目标:

1)如果没有为子类型定义Repository,则不会生成链接,而是将其嵌入父对象中。当然,只有当您不需要Repository该对象时,这才有用。

2)FetchType.EAGER将急切加载子对象。由于对象已经加载,因此没有理由提供它的链接,因此spring-data-rest将嵌入该对象。确保将其放在单个对象的一侧,而不是Collection