Hibernate导致@ManyToMany双向关系

时间:2016-04-04 11:58:41

标签: java hibernate postgresql

我的项目中有两个实体,它们之间有多对多的关系。该关系使用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课程(不需要)

当我运行这个简单的查询时:

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
}

2 个答案:

答案 0 :(得分:4)

原来问题来自于Model。虽然Model没有对Bucket的任何引用,但它确实引用了另一个带有@OneToMany注释的对象(引用的对象引用了Model @ManyToOne )。

我将所有内容(Bucket,Model和第三个对象)转换为DTO,现在它可以正常工作。它工作的原因是因为当jackson lib尝试序列化结果时导致无限循环。因为存在从Model对象到另一个对象的双向引用,它会陷入无限循环,试图序列化它们。通过转换为DTO,我确保只有Model拥有对另一个对象的引用,以便解决问题。

您可以按照导致答案here

的聊天进行操作

答案 1 :(得分:-1)

我应该从模型中删除关系(如果有)或添加MappedBy。 如果您与Model.class@MappedBy有关系,那么您可以在bucket_object_mapping的{​​{1}}表上创建第一条记录,为Bucket创建第二条记录