2016-04-04 57 views
2

私のプロジェクトには2つのエンティティがあり、それらの間には多対多の関係があります。関係は、ポストグルのヘルパーマッピングテーブルを使用して表現されます。このテーブルには、各エンティティの関連ID(かなり標準的なもの)が含まれています。Hibernateは@ManyToMany双方向関係で無限ループを引き起こします

表をbucket_object_mappingとし、2つの列、bucket_id,object_idとします。

バケットクラス:私は(それは必要)Bucketクラスへのマッピングを持たないModelクラスで

@Entity 
@Table(name = "bucket") 
public class Bucket { 
    // Some fields omitted here 

    @ManyToMany(cascade = {}, fetch = FetchType.LAZY) 
    @JoinTable(
     name = "bucket_object_mapping", 
     joinColumns = @JoinColumn(name = "bucket_id"), 
     inverseJoinColumns = @JoinColumn(name = "object_id") 
    ) 
    private List<Model> models; 
} 

私はこの単純なクエリを実行すると:

SELECT bucket FROM Bucket bucket WHERE bucket.customerId=:customerId 

データは最初は問題なく返されますが、その後はへの無限ループのクエリが返されます10テーブルが走り始めるのはなぜなのか分かりません。私がSpringMVCコントローラを通して結果リストを返すと、それが起こっているように見えます。 私はBucketをDTOに変換しますが、Modelではありません(ModelエンティティにはBucketへの参照がないため、循環参照の問題はないはずです)。

コントローラーコード:

@RequestMapping(value = "", method = RequestMethod.GET) 
@ResponseBody 
public List<BucketDTO> getAllByCustomer(@RequestParam(value = "customerid") final Long customerId) { 
    return bucketService.getAllBucketsForCustomer(customerId); 
} 

サービスのコード:

@Transactional 
public List<BucketDTO> getAllBucketsForCustomer(final Long customerId) { 
    List<Bucket> buckets = bucketDao.getBucketsForCustomer(customerId); 
    List<BucketDTO> result = bucketDtoConverter.toDtoList(buckets); 
    return result 
} 
+0

につながっチャットをたどることができますか? – LearningPhase

+0

@LearningPhase - 質問を編集しました。私はまた、コントローラとDAOの間を橋渡しするサービスメソッドを追加しました。 – Avi

+0

Show Model.class。 Bucket.classとの関係はありますか? – Victor1125

答えて

4

ためBucket用のテーブルbucket_object_mapping上の最初のレコードと第二のレコードを作成Modelに発信された問題が判明。 ModelBucketへの参照を持っていませんが、@OneToMany注釈を持つ別のオブジェクトへの参照を持っています(参照オブジェクト参照Model@ManyToOneです)。

私はすべて(バケット、モデル、第3のオブジェクト)をDTOに変換しています。その理由は、ジャンクソンのlibが結果をシリアル化しようとしたときに無限ループが発生したためです。 Modelオブジェクトから別のオブジェクトへの双方向参照があったため、それらを直列化しようとする無限ループに陥りました。 DTOに変換することによって、Modelが他のオブジェクトへの参照を保持していることを確認し、問題を解決しました。

あなたは、あなたのコントローラーのコードを投稿してくださいすることができ答えhere

-1

私はあなたが(あなたが持っている場合)モデルから関係を削除したり、MappedByを追加する必要がありthnik。あなたはModel.classなし@MappedBy上の関係を持っている場合は はあなたがModel

+0

私はあなたの答えを正確に理解しているかわかりません。しかし、私は 'モデル'に 'バケット'の言及はありません。この関係は双方向ですが、現時点では「バケット」の端からのみ必要です。だから - 'モデル'エンティティの 'バケツ'の言及はありません – Avi

+0

私はあなたが持っていると思っています。さて、申し訳ありません。 – Victor1125

+0

問題ありません。あなたのお手伝いを心より感謝します。 – Avi

関連する問題