【问题标题】:Spring JPA One2Many Relationship ids are not updated/inserted correctlySpring JPA One2Many 关系 ID 未正确更新/插入
【发布时间】:2021-05-17 19:46:49
【问题描述】:

我正在做一个 Spring/React 项目,我有大约 10 个表,其中包含多个关系。

但我遇到了一个非常烦人的情况,就是找不到正确的解决方案。我有几个表包含 one2many 关系:

Product.category_id --> Category.id
Product.manufacturer_id --> Manufacturer.id

产品实体:

@ManyToOne
@JoinColumn(name="category_id", referencedColumnName = "id", nullable = true)
private Category category;

@ManyToOne
@JoinColumn(name="manufacturer_id", referencedColumnName = "id")
private Manufacturer manufacturer;

产品控制器:

@PostMapping(value="/admin/product")
public ResponseEntity<Object> createProduct(@RequestBody Product product) {
    System.out.println(product.getCategory());
    System.out.println(product.getManufacturer());
    productRepository.save(product);
    URI location;
    return new ResponseEntity<>("Toegevoegd", HttpStatus.CREATED);
}

 @PutMapping(value = "/admin/product/{id}")
    public Product updateProduct(@RequestBody Product product, @PathVariable Long id) {
        return productRepository.findById(id)
            .map(updateProduct -> {
                updateProduct.setCategory(product.getCategory());
                updateProduct.setManufacturer(product.getManufacturer());
                updateProduct.setName(product.getName());
                updateProduct.setPrice(product.getPrice());
                updateProduct.setTaste(product.getTaste());
                updateProduct.setImagePath(product.getImagePath());
                updateProduct.setStock(product.getStock());
                updateProduct.setDescription(product.getDescription());
                updateProduct.setType(product.getType());
                return productRepository.save(updateProduct);
            })
            .orElseGet(() -> {
                return productRepository.save(product);
            });
    }

类别实体:

@OneToMany(mappedBy = "category")
@JsonIgnore
private Set<Product> Product;

当我获得产品概述时,该关系有效,我得到“1 - 测试”,但当我想发送 POST 请求时,制造商/类别始终为空。我用 Postman 发送的输出:

{

    "categoryId": "999",
    "name":"Test",
    "taste":"sdads",
    "price":"1",
    "stock": "123",
    "manufacturerId": "1",
    "description" : "213",
    "discount" : "0"
}

由于 camelCase 约定,它必须从前端以这种方式发送。烦人的部分是,当我没有在产品类别/产品制造商之间添加关系时,我使用了:

@Column(name="manufacturer_id")
private long manufacturerId;

@Column(name="category_id")
private long categoryId;

它确实有效,我可以发布/放置数据并将其保存到数据库中。当我将此代码与 one2many 映射一起使用时,它显示“类别”已定义(或 smt)。一位老师说框架会自动管理它并说关系还可以。好吧,它不起作用。

用关系保存数据的正确方法是什么?所有其他非关系列在更新/插入时都没有问题。

【问题讨论】:

  • 你能把使用@ManyToOne时应用程序产生的错误或stacktrace贴在这里吗?

标签: java reactjs spring postgresql jpa


【解决方案1】:

当您使用 JSON 发送 POST 查询时,Jackson 将该 JSON 转换为 Product 对象。由于 Product 没有manufacturerId 或 categoryId 等字段,Jackson 会忽略它们。

难怪类别和制造商字段为空 - JSON 没有这样的字段。

您应该创建一个与 Product 具有相同字段的类 ProductDto,但它应该具有制造商 ID 和类别 ID,而不是制造商和。您应该在代码中手动将 ProductDto 转换为 Product,使用 categoryId 填充类别,使用manufacturerId 填充制造商。这是正确的方法。

另一种选择是将完整的制造商和类别对象添加到您的 JSON 中

{
    "category": {
        "id": "999"
     },
    "name":"Test",
    "taste":"sdads",
    "price":"1",
    "stock": "123",
    "manufacturer": {
        "id": "1"
    },
    "description" : "213",
    "discount" : "0"
}

Should work, but I don't recomend it

【讨论】:

  • 您提供的第二个选项有效(使用 id,而不是 categoryid)。但是你不会推荐它,你能给我一个理由吗?在课程中并没有真正提到 DTO,所以这是新的,我很好奇。因为这两个对象中可能存在空数据?
  • 不推荐,因为一般情况下,你不应该让你的实体为外界所知。假设,您将决定不应该映射 OneToMany,而只映射制造商 ID 列,因为性能原因。您将不得不告诉人们重组他们的查询。但是如果你的控制器中有 DTO,你只需要改变你的 merhod 的代码。
猜你喜欢
  • 2013-06-28
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多