当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring Data JPA关系插入数据

邰宇
2023-03-14

希望这是一个简单的问题,但我对JPA很陌生,很难确定如何格式化发送到Spring API的JSON POST请求体。我有两个实体,产品和条形码,其关系如下:

  • 一个产品可以有多个指向它的条形码(一个)
  • 一个条形码只能指向一个产品(OneToOne)

该关系由条形码表中的product_id列定义。

@OneToOne // one barcode relates to one product
private ProductEntity product;

产品中的关系定义:

@OneToMany(cascade = CascadeType.ALL)
private List<BarcodeEntity> barcodes = new ArrayList<>();

我的问题是,我如何做一个JSON POST请求来插入一个与数据库中已经存在的产品相关的条形码?我需要传递整个Product实体吗,还是有办法只传递product_id?

当产品已经存在时,我希望如何创建新的条形码条目:

{ 
  "barcode": "string",
  "barcodeStatus": "string",
  "codeStandard": "string",
  "product": 1,
  "title": "string",
  "unitQuantity": 0
}
{ 
  "barcode": "string",
  "barcodeStatus": "string",
  "codeStandard": "string",
  "product": {
     productInfo: "...",
     ....,
  },
  "title": "string",
  "unitQuantity": 0
}

本质上,我试图弄清楚如何插入一个新实体,并定义它与数据库中已经存在的另一个实体的关系。我肯定我已经把它复杂化了。

产品控制器中的终结点:

@PostMapping(produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public ProductRest createProduct(@Valid @RequestBody ProductRequestModel productDetails) throws Exception {
    ProductRest returnValue = new ProductRest();

    ModelMapper modelMapper = new ModelMapper();
    ProductDto productDto = modelMapper.map(productDetails, ProductDto.class);

    ProductDto createdProduct = productService.createProduct(productDto);
    returnValue = modelMapper.map(createdProduct, ProductRest.class);

    return returnValue;
}

产品服务文件中的createProduct方法

public ProductDto createProduct(ProductDto product) {
    if (productRepo.findByTitle(product.getTitle()) != null)
        throw new ServiceException("Record with matching title already exists");

    // Set product id for each barcode
    for (int i = 0; i < product.getBarcodes().size(); i++) {
        ProductBarcodeDto barcode = product.getBarcodes().get(i);
        barcode.setProduct(product); 
        product.getBarcodes().set(i, barcode);
    }

    ModelMapper modelMapper = new ModelMapper();
    ProductEntity productEntity = modelMapper.map(product, ProductEntity.class);

    ProductEntity storedProductDetails = productRepo.save(productEntity); 

    ProductDto returnValue = modelMapper.map(storedProductDetails, ProductDto.class);
    return returnValue;
}

ProductDto中的字段(定义getter/setters和空构造函数;只是未显示):

public class ProductDto {

private long id;
private List<BarcodeDto> barcodes;
private String title;
private String description;
private String SKU;
private ProductVariationDto variation;
private double cost;
private double retailPrice;
private LocalDate launchDate;
private LocalDate discontinueDate;
private String discontinueReason;
private String salesChannel;
private LabelDto label;
private int secondaryStockLevel;
private int primaryStockLevel;
private LocalDateTime modifiedDate;
private LocalDateTime createdDate;
private String productStatus;
private List<SupplierDto> suppliers;
}

我将其设置为ProductRequestModel需要一个BarCodeEntity。这是正确的吗?还是我应该将它更改为条形码ID只有一个整数值?

在条形码控制器中创建条形码终结点:

@PostMapping(produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public BarcodeRest createBarcode(@Valid @RequestBody BarcodeRequestModel barcodeDetails) throws Exception {
    BarcodeRest returnValue = new BarcodeRest();

    ModelMapper modelMapper = new ModelMapper();
    BarcodeDto barcodeDto = modelMapper.map(barcodeDetails, BarcodeDto.class);

    BarcodeDto createdBarcode = barcodeService.createBarcode(barcodeDto);
    returnValue = modelMapper.map(createdBarcode, BarcodeRest.class);

    return returnValue;
}

createBarcode方法实现:

public BarcodeDto createBarcode(BarcodeDto barcode) {
    ModelMapper modelMapper = new ModelMapper();

    if (barcodeRepo.findByBarcode(barcode.getBarcode()) != null)
        throw new ServiceException("Barcode value already exists.");

    BarcodeEntity barcodeEntity = modelMapper.map(barcode, BarcodeEntity.class);
    BarcodeEntity storedBarcode = barcodeRepo.save(barcodeEntity);

    BarcodeDto returnValue = modelMapper.map(storedBarcode, BarcodeDto.class);
    return returnValue;
}

共有1个答案

吕亮
2023-03-14

首先,数据库模式映射似乎存在一个问题:

一个产品:多个条形码(一对多)[无问题]

多条形码:一个产品(多对一,而不是一对一)[有问题]

 类似资料:
  • 问题内容: 我正在尝试使用Java将数据插入mysql数据库。我正在使用以下代码从数据库中获取数据,并且工作正常。 为了插入数据,我尝试了上面的代码,仅替换了 与 但是它显示出一些错误。您能告诉我代码中的问题在哪里吗? 谢谢 :) 问题答案: 如果您的主键是自动递增,则可以尝试此操作;

  • 问题内容: 我创建了一个数据库名称movielibrarysystem,其中有3个表。 分别是类型,发布者和电影..​​.现在1个发布者可以有很多电影,而1个电影则有很多类型..在movie表中,发布者ID和typeid都充当外键。 我的问题是,如何在电影表中插入数据…我已经将数据插入到发行商和类型表中,但是我无法插入电影表中。 问题答案: 这就是你要做的。首先,发行人与电影之间的关系是一对多的-

  • 问题内容: 当我尝试使用此查询时,我收到一条错误消息,指出Perameter电子邮件不存在,我确定变量:email,login_pass,payment_method,operateur是有效的并且存在。 我尝试删除引号,但我得到了 您的Sql语法有错误,请在第1行的’:email,:login_pass,:payment_method,:avecpuce)’附近查看与您的SQL Server对应

  • 问题内容: 当前,当通过print_r()输出时,我有一个类似于以下内容的数组; 我想将此数据插入到一个表中,每个元素值都属于其各自的字段。 目前,我的php代码如下所示 注意:R_ID不是此表中的主键。 有人可以帮助我了解如何应对这种情况吗?感谢您的阅读和帮助! 问候。 问题答案: 我会避免对每个条目进行查询。

  • 我在房间使用关系中添加了一对多关系。我引用这篇文章是为了编写以下房间关系代码。 这篇文章讲述了如何从数据库中读取值,但将实体存储到数据库中会导致用户ID为空,这意味着这两个表之间没有关系。 我不确定在具有用户ID值的情况下,将用户和宠物列表插入数据库的理想方法是什么。 1)用户实体: 2) 宠物实体: 3)用户带宠物POJO: 现在,为了从DB中获取记录,我们使用以下DAO: 编辑 我已创建此问题

  • 我正在尝试使用Pig将HDFS中的文件中的数据复制到Cassandra中的表中。但在将数据存储在Cassandra中时,作业失败,出现空指针异常。有人能帮我吗? 用户表结构: 创建表用户(user\u id text主键、age int、第一个文本、最后一个文本) 我的猪脚本 > A=加载“/用户/hduser/用户。txt“使用PigStorage(',')作为(id:chararray,age