0

저는이 웹 서비스 프로젝트에서 Spring (xml + annotations), Hibernate (annotation)을 사용하고 있습니다. 데이터베이스의 관계도를, 모델,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 
     } 
    ] 
} 

I 수로부터 고객 정보를 가져올 수 잭슨 Json을 사용하여 데이터베이스를로드하지 못했습니다. @JsonManagedReference를 제거하면 순환 루프가 발생합니다. @JsonBackReference를 제거하면 출력에 효과가 없습니다. 전체 코드 : https://github.com/liwevire/TM_Service 미리 감사드립니다.

답변

2

당신이 Loan 기업의 Customer 특성에 @JsonBackReference을 사용하고 있기 때문에는 Customer 객체 직렬화에 포함되지 않습니다. Loan 개체의 Customer@JsonManagedReference을 사용하고 Customer 개체의 Loan 속성에 @JsonBackReference을 사용합니다.

Loan 엔티티의 Customer 속성을 일련 번호로 사용합니다. 그러나 Customer 개체 직렬화는 Loan 속성을 포함하지 않습니다. 직렬화 할 관계의 한면을 선택해야합니다.

양면을 허용하려면 @JsonIdentityInfo 특수 효과를 사용하고 @JsonBackReference@JsonManagedReference을 삭제하세요. customerId 될 것 Customer이 들어, 엔티티 ID 속성을 참조 @JsonIdentityInfo

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "customerId") 
public class Customer implements Serializable { 
    ... 
} 

property : 당신 실체는 무엇인가있을 것입니다. LoanItem에도이 작업을 수행하십시오.

+0

둘 다 가질 수 없습니까? Coz, 고객이 가지고있는 대출을 알고 싶습니다. 때로는 대출 대상자를 원합니다. 어쨌든 응용 프로그램 간의 트래픽 증가로 인해 상황을 관리 할 수 ​​있습니다. – liwevire

+0

'@ JsonIdentityInfo' 주석을 사용할 수 있습니다. 모든'@ JsonBackReference'와'@ JsonManagedReference'를 엔티티에서 제거하십시오. 그리고'Customer','Loan','Item'에'@JsonIdentityInfo'를 추가하십시오. –

+0

아래 출력 '{ "loanId": 2, "customer": { "customerId": 1, "name": "Premkumar", "secondaryName": "T", "date": 1484663297000, "address" Pod ":"614804 ","전화 ":"","loans ": [2, {"loanId ": 3,"customer ": 1,"date " ": 1484591400000,"amount ": 20.0,"items ": [{"itemId ": 2,"loan ": 3,"name ":"L2 ","weight ": 10]], { "loanId": 4, "customer": 1, "date": 1484937000000, "amount": 10000.0, "items": [{ "itemId": 3, "loan": 4, "name ":"Item1 ","weight ": 10.0}, {"itemId ": 4,"loan ": 4,"name ":"Item2 ","weight ": 20.0}]}]},"date ": 1484591400000 , "amount": 40.0, "items": [{ "itemId": 1, "loan": 2, "name": "PT1", "weight": 1.0}]} – liwevire