0

Я использую Spring (xml + аннотации), Hibernate (аннотации) в этом проекте веб-сервиса. Диаграмма отношения базы данных, модели, ожидаемый и фактический объем производства приведены ниже,Jackson двунаправленная связь (один-ко-многим) не работает

Database Table relationship

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 Заранее спасибо.

ответ

2

Поскольку вы используете @JsonBackReference на 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 относятся к вашей собственности Идентификатор объекта, для Customer этого будет customerId. Сделайте это для Loan и Item также.

+0

У меня нет обоих? Coz, иногда я хочу знать кредиты, которые есть у клиента. Иногда я хочу, чтобы кто помечен для получения кредита. В любом случае я могу справиться с ситуацией за счет увеличения трафика между приложениями. – liwevire

+0

Вы можете использовать аннотацию '@ JsonIdentityInfo'. Удалите все сущности '@ JsonBackReference' и' @ JsonManagedReference'. И добавьте '@ JsonIdentityInfo' для' Customer', 'Loan' и' Item'. –

+0

Результат ниже '{" 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

 Смежные вопросы

  • Нет связанных вопросов^_^