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

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

先上实体类:

@Entity
@Table
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class User implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -943171790037999181L;

	private long id;
	
	private String username;
	
	private Set<Item> items = new HashSet<Item>();

	//忽略其他method

	@OneToMany(mappedBy = "seller")
	@JsonIgnoreProperties(value = {"seller"}, ignoreUnknown = true)
	public Set<Item> getItems() {
		return items;
	}

	public void setItems(Set<Item> items) {
		this.items = items;
	}
	
}
@Entity
@Table(name = "ITEM_NPLUS_SELECT")
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Item implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -5912463915025857241L;

	private long id;
	
	private String name;
	
	private LocalDateTime auctionEnd;
	
	private User seller;
	
	private Set<Bid> bids = new HashSet<Bid>();

	//忽略其他method

	@NotNull
	@ManyToOne(fetch = FetchType.LAZY)
	@JsonIgnoreProperties(ignoreUnknown = true, value = {"items"})
	public User getSeller() {
		return seller;
	}

	public void setSeller(User seller) {
		this.seller = seller;
	}

	@OneToMany(mappedBy = "item")
	@org.hibernate.annotations.BatchSize(size = 5)
	@JsonIgnoreProperties(ignoreUnknown = true, value = {"item"})
	public Set<Bid> getBids() {
		return bids;
	}

	public void setBids(Set<Bid> bids) {
		this.bids = bids;
	}
}
@Entity
@Table
@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
public class Bid implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 7126592140361715240L;

	private long id;
	
	private BigDecimal amount;
	
	private Item item;

	//忽略其他method

	@NotNull
	@ManyToOne(fetch = FetchType.LAZY)
	@JsonIgnoreProperties(ignoreUnknown = true, value = {"bids"})
	public Item getItem() {
		return item;
	}

	public void setItem(Item item) {
		this.item = item;
	}
	
}

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


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Hibernate 实体中常用的注解如下: 1. @Entity:表明该是一个实体,用于与数据库中的表相映射。 2. @Table:用于指定实体与数据库中哪张表相映射。 3. @Id:用于指定实体中的主键属性。 4. @GeneratedValue:用于指定主键生成策略,常用的生成策略有 AUTO、IDENTITY、SEQUENCE 和 TABLE。 5. @Column:用于指定实体属性与数据库表中哪个列相映射。 6. @Transient:用于标注实体中不需要持久化到数据库中的属性。 7. @Temporal:用于指定实体属性与数据库表中的日期时间型相映射。 8. @OneToMany:用于指定实体之间的一对多关系。 9. @ManyToOne:用于指定实体之间的多对一关系。 10. @ManyToMany:用于指定实体之间的多对多关系。 11. @JoinTable:用于指定多对多关系中的关联表。 12. @JoinColumn:用于指定实体之间的关联属性。 13. @OrderBy:用于指定查询结果集的排序方式。 14. @NamedQuery:用于定义命名查询。 15. @NamedNativeQuery:用于定义本地 SQL 命名查询。 16. @NamedStoredProcedureQuery:用于定义存储过程命名查询。 17. @SqlResultSetMapping:用于定义查询结果集与实体之间的映射关系。 18. @Version:用于指定实体中的乐观锁版本属性。 以上是 Hibernate 实体中常用的注解,不同的注解在实体中的作用也不同。需要根据具体的业务需求来选择合适的注解进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值