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
预先感谢。
回答:
由于您在实体中使用@JsonBackReference
on
Customer
属性,因此Loan
该Customer
对象将不包含在序列化中。使用@JsonManagedReference
了Customer
在Loan
对象和使用@JsonBackReference
上Loan
的物业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
。为此Loan
,Item
也。
以上是 Jackson双向关系(一对多)不起作用 的全部内容, 来源链接: utcz.com/qa/412499.html