Jackson双向关系(一对多)不起作用

我在此Web服务项目中使用Spring(xml +

annotations),Hibernate(annotations)。数据库关系图,模型,预期和实际输出如下所示,

数据库表关系

客户.java

@Entity

@Table(name="customer")

public class Customer implements Serializable{

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="customer_id", unique=true, nullable =false)

long customerId;

@Column(name="name")

String name;

@Column(name="secondary_name")

String secondaryName;

@Column(name="date")

Date date;

@Column(name="address")

String address;

@Column(name="post")

String post;

@Column(name="pin")

String pin;

@Column(name="phone")

String phone;

@OneToMany(fetch=FetchType.LAZY, mappedBy="customer", cascade=CascadeType.ALL)

@JsonManagedReference

Set<Loan> loans = new HashSet<Loan>();

//constructors, getters and setters

}

贷款java

public class Loan implements Serializable{

/**

*

*/

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="loan_id", nullable=false, unique=true)

long loanId;

@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)

@JoinColumn(name="customer_id", nullable = false)

@JsonBackReference

Customer customer;

@Column(name="date", nullable=false)

Date date;

@Column(name="amount", nullable=false)

double amount;

@OneToMany(fetch=FetchType.LAZY, mappedBy="loan", cascade=CascadeType.ALL)

@JsonManagedReference

List<Item> items = new ArrayList<Item>();

//constructors, getters, setters

}

Item.java

public class Item implements Serializable{

/**

*

*/

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

@Column(name="item_id", nullable=false, unique=true)

long itemId;

@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)

@JoinColumn(name="loan_id", nullable = false)

@JsonBackReference

Loan loan;

@Column(name="name", nullable=false)

String name;

@Column(name="weight", nullable=false)

double weight;

//constructors, setters, getters

}

实际输出:此处未显示客户详细信息

{  

"loanId":4,

"date":1484937000000,

"amount":10000.0,

"items":[

{

"itemId":3,

"name":"Item1",

"weight":10.0

},

{

"itemId":4,

"name":"Item2",

"weight":20.0

}

]

}

预期输出:在寻找贷款时也需要显示客户详细信息

{  

"loanId":4,

"customer":{

"customerId":2,

"name":"Prem",

"address":"Street,State"

},

"date":1484937000000,

"amount":10000.0,

"items":[

{

"itemId":3,

"name":"Item1",

"weight":10.0

},

{

"itemId":4,

"name":"Item2",

"weight":20.0

}

]

}

我可以从数据库中获取客户详细信息,而无法使用Jackson

Json加载它。如果删除@JsonManagedReference,则会导致循环循环。如果删除@JsonBackReference,则输出中没有任何影响。有关完整代码,请访问:https

//github.com/liwevire/TM_Service

预先感谢。

回答:

由于您在实体中使用@JsonBackReferenceon

Customer属性,因此LoanCustomer对象将不包含在序列化中。使用@JsonManagedReferenceCustomerLoan对象和使用@JsonBackReferenceLoan的物业Customer实体。

这将序列化Customer您的Loan实体的属性。但是Customer对象序列化将不包含该Loan属性。您需要选择关系的一侧进行序列化。

要允许双方,请@JsonIdentityInfo在您的实体中使用注释,然后删除@JsonBackReference@JsonManagedReference。您的实体将类似于:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "customerId")

public class Customer implements Serializable {

...

}

property@JsonIdentityInfo参考您的实体ID属性,Customer这将是customerId。为此LoanItem也。

以上是 Jackson双向关系(一对多)不起作用 的全部内容, 来源链接: utcz.com/qa/412499.html

回到顶部