@JsonIgnoreProperties解决jackson 序列化Hibernate entity类无限递归的问题

Hibernate 这种ORM框架 通过实体类间相互关联来表示数据库表数据的外键。在使用Jackson序列化时就会出现无限循环或递归的问题导致序列化报错。现在百度一搜就会出现很多几乎一样的解决方法,使用@JsonIgnore,@JsonIdentityInfo,@JsonManagedReference and @JsonBackReference这几个注解,这里就不在写同样的东西了。我们要说一下@JsonIgnoreProperties这个注解, 当然网络上也有这个的一些文章,基本都是说这个可以用在类上指定某些要忽略的属性。

先上实体类:


  
  
  1. @Entity
  2. @Table
  3. @JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
  4. public class User implements Serializable {
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = - 943171790037999181L;
  9. private long id;
  10. private String username;
  11. private Set<Item> items = new HashSet<Item>();
  12. //忽略其他method
  13. @OneToMany(mappedBy = "seller")
  14. @JsonIgnoreProperties(value = {"seller"}, ignoreUnknown = true)
  15. public Set<Item> getItems() {
  16. return items;
  17. }
  18. public void setItems(Set<Item> items) {
  19. this.items = items;
  20. }
  21. }

  
  
  1. @Entity
  2. @Table(name = "ITEM_NPLUS_SELECT")
  3. @JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
  4. public class Item implements Serializable {
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = - 5912463915025857241L;
  9. private long id;
  10. private String name;
  11. private LocalDateTime auctionEnd;
  12. private User seller;
  13. private Set<Bid> bids = new HashSet<Bid>();
  14. //忽略其他method
  15. @NotNull
  16. @ManyToOne(fetch = FetchType.LAZY)
  17. @JsonIgnoreProperties(ignoreUnknown = true, value = {"items"})
  18. public User getSeller() {
  19. return seller;
  20. }
  21. public void setSeller(User seller) {
  22. this.seller = seller;
  23. }
  24. @OneToMany(mappedBy = "item")
  25. @org.hibernate.annotations.BatchSize(size = 5)
  26. @JsonIgnoreProperties(ignoreUnknown = true, value = {"item"})
  27. public Set<Bid> getBids() {
  28. return bids;
  29. }
  30. public void setBids(Set<Bid> bids) {
  31. this.bids = bids;
  32. }
  33. }

  
  
  1. @Entity
  2. @Table
  3. @JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
  4. public class Bid implements Serializable {
  5. /**
  6. *
  7. */
  8. private static final long serialVersionUID = 7126592140361715240L;
  9. private long id;
  10. private BigDecimal amount;
  11. private Item item;
  12. //忽略其他method
  13. @NotNull
  14. @ManyToOne(fetch = FetchType.LAZY)
  15. @JsonIgnoreProperties(ignoreUnknown = true, value = {"bids"})
  16. public Item getItem() {
  17. return item;
  18. }
  19. public void setItem(Item item) {
  20. this.item = item;
  21. }
  22. }

在类上声明的@JsonIgnoreProperties是忽略Hibernate的延迟加载的一些属性"hibernateLazyInitializer", "handler", "fieldHandler",这些属性在实体类里没有所以要忽略掉,否则会报错, 在getter方法上的@JsonIgnoreProperties是声明在序列化时忽略这个属性类的某个属性(例如 User类里的getItems()方法声明忽略掉 Item类里的seller属性,因为seller是引用User类,形成了循环
) 。这样无论从那个上返回Json都不会有闭环,解开了循环引用的问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值