簡體   English   中英

Hibernate使用@ManyToMany雙向關系導致無限循環

[英]Hibernate causes infinite loop with @ManyToMany bidirectional relation

我的項目中有兩個實體,它們之間具有多對多關系。 該關系使用postgres中的幫助程序映射表表示,該表包含每個實體的相關ID(相當標准)。

我們將其稱為表bucket_object_mapping ,它具有兩列: bucket_idobject_id

桶類:

@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;
}

Model類中,我沒有映射到Bucket類(不需Bucket

當我運行此簡單查詢時:

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

數據一開始會很好地返回,但是隨后對Model表的無限查詢循環開始運行,我不確定為什么。 當我通過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
}

原來問題出在Model 盡管Model沒有對Bucket任何引用,但它確實具有對帶有@OneToMany批注的對象的引用(並且所引用的對象使用@ManyToOne引用了Model )。

我將所有內容(Bucket,Model和第3個對象)都轉換為DTO,現在可以使用了。 之所以起作用,是因為無限循環是在傑克遜庫試圖序列化結果時引起的 因為存在從Model對象到另一個對象的雙向引用,所以它陷入了一個無限循環中,試圖對其進行序列化。 通過轉換為DTO,我確保只有Model擁有對另一個對象的引用,從而可以解決此問題。

您可以在此處關注導致答案的聊天

我想您應該從模型中刪除關系(如果有的話)或添加MappedBy。 當您在Model.class上具有關系而沒有@MappedBy ,您在表bucket_object_mappingBucket創建第二條記錄,並在Model上創建第二條記錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM