无法使用具有@OneToMany关系的Spring Data持久保存Json对象

时间:2014-07-06 09:13:14

标签: java json spring hibernate spring-data

我有一个名为Sale的实体,其中包含对象列表SaleData,我在这两个实体之间建立了单向@OneToMany关系。现在我在Sale对象上进行CRUD操作时遇到了问题。

CascadeType设置为ALL

@Entity
@Table(name = "sale")
public class Sale extends BaseEntity {

  @OneToOne(cascade = CascadeType.DETACH)
  private Client client;

  @OneToMany(cascade = {CascadeType.ALL}) // <--
  @JoinColumn(name = "sale_id", nullable = false)
  private List<SaleData> saleData = new ArrayList<>();
}

保存(POST)和删除工作。造成问题的原因是POST更新时,我从Angular控制器发送的JSON看起来像这样:

{"id": 1, "client": {
    "id": 1,
    "firstName": "Test",
    "lastName": "Client"
}, "saleData": [
    {
        "id": 1,
        "employee": {
            "id": 1,
            "firstName": "Herp",
            "lastName": "Derp"
        }
    },
    {
        "id": 2,
        "employee": {
            "id": 1,
            "firstName": "John",
            "lastName": "Smith"
        }
    }
]}

来自Spring服务的更新调用抛出:

org.hibernate.PersistentObjectException: detached entity passed to persist: app.sales.SaleData

服务实施

  @Override
  @Transactional(rollbackFor = SaleNotFoundException.class)
  public Sale update(@NotNull SaleDTO updated) {
    Sale sale = repository.findOne(updated.getId());

    if (sale == null)
      throw new SaleNotFoundException("Sale not found");

    return transformSaleObject(sale, updated);
  }

据我了解,cascade ALL不会使销售对象Deattached,因为在第二种情况下我用任意组合替换类型...

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.DETACH})

..然后更新删除有效,但保存新对象却不起作用。我没有那么多使用Hiberate,但也许有人知道是什么导致了这种行为?这是以错误的方式定义关系的问题吗?

更新 变换方法就是这样,但无论如何看起来它现在都解决了我的问题:)

  private Sale transformSaleObject(Sale sale, SaleDTO dto) {
    sale.setClient(dto.getClient());
    sale.setSaleData(dto.getSaleData());
    sale.setService(dto.getService());
    sale.setHours(dto.getHours());
    sale.setPrice(dto.getPrice());
    sale.setSaleStatus(dto.getSaleStatus());
    sale.setSaleDate(dto.getSaleDate());
    return sale;
  }

我更改了我的更新方法如下:

  public Sale update(@NotNull SaleDTO updated) {
    Sale sale = repository.findOne(updated.getId());

    if (sale == null)
      throw new SaleNotFoundException("Sale not found");

    transformSaleObject(sale, updated);

    return repository.saveAndFlush(sale);
  }

0 个答案:

没有答案