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都不会有闭环,解开了循环引用的问题。