0

私はこのWebサービスプロジェクトでSpring(xml +注釈)、Hibernate(注釈)を使用しています。関係図、モデル、期待される実際の出力は、以下に示すデータベース、ジャクソンの双方向関係(一対多)が動作しない

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

あなたは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

私は両方を持つことはできませんか?私は顧客が持っているローンを知りたいときがあります。時には、誰が融資の対象にタグ付けされているのが欲しいのですか。 とにかく、私はアプリケーション間のトラフィック増加の犠牲を払って状況を管理することができます。 – liwevire

+0

'@ JsonIdentityInfo'アノテーションを使用できます。すべての '@ JsonBackReference'と' @ JsonManagedReference'をエンティティから削除してください。そして、 'Customer'、' Loan'、 'Item'に' @JsonIdentityInfo'を追加します。 –

+0

以下の出力 '{" loanId ":2、" customer ":{" customerId ":1、" name ":" Premkumar "、" secondaryName ":" T "、" date ":1484663297000、" address " 「2」「loanId」:3、「customer」:1、「date」、「Sethu Road」、「post」、「PVI」、「pin」:「614804」、「phone」:「」、「loans」: ":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

関連する問題