@JsonIgnore @JsonIdentityInfo 处理Hibernate 循环引用的问题

enterprise和user一对一的关系:

@Entity
@Table(name = "enterprise")
public class Enterprise extends BaseEntity {

    private static final long serialVersionUID = 1L;

    private User user;

    private String name;

    @OneToOne(mappedBy = "enterprise")
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    ...setter/getter
}
@Entity
@Table(name = "APP_USER")
public class User extends BaseEntity {
    @NotEmpty
    @Column(name = "FIRST_NAME", nullable = false)
    private String firstName;

    @Column(name = "LAST_NAME", nullable = true)
    private String lastName;

    @OneToOne
    private Enterprise enterprise;
}

在controller中,使用ResponseEntity来返回enterprise转换为json之后的字符串。如果不做任何处理,因为enterprise拥有user字段,而user也拥有enterprise字段,自此出现了循环引用的问题,程序将会出错。

使用@JsonIgnore

@JsonIgnore
@OneToOne(mappedBy = "enterprise")
public User getUser() {
    return user;
}

在getUser方法上添加@JsonIgnore注释,返回的enterprise json对象中,将不包括user对象。
但是如果我们希望在enterprise json对象中包括user的json对象该怎么办呢?

使用@JsonIdentityInfo

Annotation used for indicating that values of annotated type or property should be serializing so that instances either contain additional object identifier (in addition actual object properties), or as a reference that consists of an object id that refers to a full serialization. In practice this is done by serializing the first instance as full object and object identity, and other references to the object as reference values.

在user类或者enterprise类上增加该注解即可。

@Entity
@Table(name = "enterprise")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Enterprise extends BaseEntity
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值