我在这个Web服务项目中使用Spring(xml + annotations),Hibernate(注释).数据库关系图,模型,预期和实际输出如下,
数据库表关系
Customer.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 Setloans = new HashSet (); //constructors, getters and setters }
Loan.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- items = new ArrayList
- (); //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
for,并在实体中的属性上使用.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
也.