Я использую Spring (xml + аннотации), Hibernate (аннотации) в этом проекте веб-сервиса. Диаграмма отношения базы данных, модели, ожидаемый и фактический объем производства приведены ниже,Jackson двунаправленная связь (один-ко-многим) не работает
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
Set<Loan> loans = new HashSet<Loan>();
//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<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 Заранее спасибо.
У меня нет обоих? Coz, иногда я хочу знать кредиты, которые есть у клиента. Иногда я хочу, чтобы кто помечен для получения кредита. В любом случае я могу справиться с ситуацией за счет увеличения трафика между приложениями. – liwevire
Вы можете использовать аннотацию '@ JsonIdentityInfo'. Удалите все сущности '@ JsonBackReference' и' @ JsonManagedReference'. И добавьте '@ JsonIdentityInfo' для' Customer', 'Loan' и' Item'. –
Результат ниже '{" loanId ": 2," customer ": {" customerId ": 1," name ":" Premkumar "," secondaryName ":" T "," date ": 1484663297000," address ":" Sethu Road "," post ":" PVI "," pin ":" 614804 "," phone ":""," кредиты ": [2, {" loanId ": 3," customer ": 1," date ": 1484591400000," количество ": 20,0," элементы ": [{" ItemId ": 2," кредит ": 3," название ":" L2" , "вес": 1.0}]}, { "loanId": 4, "клиент": 1, "Дата": 1484937000000, "количество": 10000.0, "элементы": [{ "ItemId": 3, "кредит": 4, "имя ":" Элемент1" , "вес": 10,0}, { "ItemId": 4, "кредит": 4, "название": "Элемент2", "вес": 20,0}]}]}, "дата": 1484591400000 , "amount": 40.0, "items": [{"itemId": 1, "loan": 2, "name": "PT1", "weight": 1.0}]} ' – liwevire