您的位置:首页 > Web前端 > JavaScript

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

2018-02-10 21:34 477 查看
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都不会有闭环,解开了循环引用的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Jackson Hibernate
相关文章推荐