JSON结果中缺少Java Jpa @ManyToOne关系

时间:2017-10-01 18:15:47

标签: java json spring jpa spring-boot

我正在使用PagingAndSortingRepository处理API我试图从存储库中获取关联的列表。这曾经工作但突然停止在这里是我的设置;

@RequestMapping(value = "products/imported", produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody Iterable<AmazonProduct> importedProducts (...) throws EncoderException, RestClientException {
        ...
        return this.AmazonProductRepository.findAll();
    } 

这是我尝试通过json返回的Product类;

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
@TypeDefs({
    @TypeDef(name = "json", typeClass = MyJsonType.class),
    @TypeDef(name = "featuresJson", typeClass = productFeaturesJsonType.class),
})
public class AmazonProduct {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "brandId") 
    @JsonManagedReference
    private AmazonBrand brand;

    public AmazonBrand getBrand() {
        return brand;
    }

    public void setBrand(AmazonBrand brand) {
        this.brand = brand;
    }
}

这是品牌关系;

@Entity
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class AmazonBrand {
    ...

    @JsonBackReference
    @OneToMany(mappedBy="brand", fetch = FetchType.LAZY) 
    private List<AmazonProduct> products;


    public List<AmazonProduct> getProducts() {
        return products;
    }

    public void setProducts(List<AmazonProduct> products) {
        this.products = products;
    }
}

当我通过浏览器运行时,我得到了;

[ {
  "publisherId" : null,
  "legalDisclaimer" : null,
  "asin" : "B00KSF9RAG",
  "title" : "Eye Mask / Sleep Mask - Sleeping Masks for...",
  "features" : {
    "features" : [ "...", "...", "..." ]
  }
}]

我希望这附属于该物业; amazonBrand。它曾经工作,但它目前无效。

我的存储库类看起来像这样;

public interface AmazonProductRepository extends PagingAndSortingRepository<AmazonProduct, Long> {

}

3 个答案:

答案 0 :(得分:0)

根据数据库依赖关系,您可能需要将注释放在“getters”而不是私有字段上。使用Hibernate和MySql时遇到了类似的问题。

答案 1 :(得分:0)

尝试在您的实体类上使用@Cacheable(false)

答案 2 :(得分:0)

JsonBackReference的文档说:

  

用于指示关联属性是的一部分的注释   领域之间的双向联系;并且其角色是“孩子”(或   “后退”)链接。该属性的值类型必须是Bean:不能是   集合,映射,数组或枚举。链接被处理为   用该注释注释的属性未序列化;和   反序列化期间,其值设置为具有   “托管”(转发)链接。

您会看到您不能将集合与@JsonBackReference一起使用,而必须是一个bean。

因此,以下行不起作用:

@JsonBackReference
@OneToMany(mappedBy="brand", fetch = FetchType.LAZY) 
private List<AmazonProduct> products;

我能够获得一些条目,并且在两个类上都删除了注释。