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