java - 如果父实体没有 ID,则直接保存 OneToMany 实体

标签 java hibernate spring-data-jpa one-to-many spring-repositories

我有 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);
}

我为每个产品创建了新的 cteore,我得到了这个:

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,否则继续使用当前代码。

关于java - 如果父实体没有 ID,则直接保存 OneToMany 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47429560/

相关文章:

java - 使用自定义 ArrayAdapter 时无法解析方法 super

java - Hikari 连接不可用和意外的多池问题

java - 如何选择最大连接池大小?

java - 如何编辑 Spring Pageable 对象?

java - 如何使用 spring data jpa 存储库以编程方式对用户进行身份验证?

java - 关闭连接后,数据连接池中的连接也不可用

java - 打开 ubuntu 终端并运行终端命令,例如 "`./executable -x -y`“形成 java 代码

java - Scala中的迭代器删除

java - JavaFX 并发修改异常

java - 从 DB 中检索一行作为 Hibernate 中的 Map