如果父母没有ID,请策划保存OneTomany实体



我有2个实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = "products")
@Entity
@Table(name = "categories")
public class Category {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String categoryName;
  private String categoryType;
  @OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
  private List<Product> products;
}

和第二实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "products")
public class Product {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;
  private String productName;
  private String productDescription;
  @ManyToOne()
  private Category category;
}

我有每个实体的2个存储库:

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
@Repository
public interface CategoryRepository extends JpaRepository<Category, Long> {
}

然后,我将此JSON发送给Cintroller,并注意保存所有产品:

{
    "products": [{
        "productName": "product1",
        "productDescription": "productDescription1",
        "category": {
            "categoryName": "catName1",
            "categoryType": "type1"
        }
    },
    {
        "productName": "product2",
        "productDescription": "productDescription2",
        "category": {
            "categoryName": "catName1",
            "categoryType": "type1"
        }
    },
    {
        "productName": "product3",
        "productDescription": "productDescription3",
        "category": {
            "categoryName": "catName2",
            "categoryType": "type2"
        }
    }]
}

然后我需要保存它:

@PostMapping(value = "test")
public Category test(@RequestBody() RequestTest products) {
  List<Product> productList = products.getProducts();
  for (Product product : productList) {
  //save all
  }
}

类别没有ID,当我获得此JSON时,我需要创建所有产品和设置类别,但是我没有类别ID,如果我下一步:

for (Product product : productList) {
      Category category = product.getCategory();
      Category save = categoryRepository.save(category);
      product.setCategory(save);
      productRepository.save(product);
}

我为每种产品创建新的CTEGORE,我得到了:

49  catName1    type1
51  catName1    type1
53  catName2    type2
                                        cat_id
50  productDescription1 product1        49
52  productDescription2 product2        51
54  productDescription3 product3        53

但我需要:

49  catName1    type1
51  catName2    type2
                                        cat_id
50  productDescription1 product1        49  
52  productDescription2 product2        49  
54  productDescription3 product3        51  

如果已经存在类别对象,您可能想首先找到。

您可以创建一个查询,如果类别以相同的名称和类型存在,则可以搜索搜索。如果存在,请使用该对象,该对象也将具有ID,否则请继续使用当前的代码。

在我看来,最好的方法是通过引入地图来跟踪保存的类别。

假设categoryName是唯一的列,那么您可以做以下操作:

Map<String,Category> categoryMap = new HashMap<>();
for (Product product : productList) {
      String categoryName = product.getCategory().getCategoryName(); 
      Category category = categoryMap.get(categoryName);
      if(category == null){
         category = categoryRepository.save(product.getCategory());
         categoryMap.put(categoryName,category);
      }       
      product.setCategory(save);
      productRepository.save(product);
}

首先插入所有唯一类别,并在数据库中检查同一类别。确保类别应该是唯一的。

最新更新