如何将数据保存到 Spring Data JPA 中的新行?

How to save data into new rows in Spring Data JPA?

我有一个JSON这样的。

{
    "productName":"soap",
    "pQty":10,
    "price" : 100,
    "customerList":[
        {
            "name":"dasun",
            "email":"lakmal@gmail.com",
            "gender":"male"
        },
        {
            "name":"BM",
            "email":"BM@gmail.com",
            "gender":"male"
        }
        ]
}

我想将此数据保存到两个单独的 table 中,分别称为 ProductCustomer,它们具有一对多的关系与出现 JSON`s 相同。

我尝试使用@OnetoMany 保存数据,但我做不到。所以我创建了这样的实体。

@Data
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "product_id",updatable = false, nullable = false)
    private Long pId;
    private String productName;
    private int pQty;
    private int price;

    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;
}

客户实体

@Data
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "customer_id",updatable = false, nullable = false)
    private Long custId;

    private String name;
    private String email;
    private String gender;
}

我的休息控制器

@PostMapping(path = "/save/product",produces = MediaType.APPLICATION_JSON_VALUE)
    public Iterable<Product> saveProduct(@RequestBody Product product){
        Iterable<Product> response = automantionApiService.saveProduct(product);
        return response;
    }

我的存储库

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

@Repository
public interface CustomerRepository extends JpaRepository<Customer,Long> {
}

这是我希望您注意的地方。这里我正在做的是迭代请求并尝试创建与请求相同的新数据行并保存到数据库。

@Override
    public Iterable<Product> saveProduct(Product product) {
        Product product1 = new com.adl.dte.core.model.Product();
        product1.setProductName(product.getProductName());
        product1.setPQty(product.getPQty());
        product1.setPrice(product.getPrice());

        Customer customer = new Customer();
        List<Customer> customerList = new ArrayList<>();

        if(!product.getCustomerList().isEmpty()){
            product.getCustomerList().forEach( listOfCust ->{
                customer.setName(listOfCust.getName());
                customer.setEmail(listOfCust.getEmail());
                customer.setGender(listOfCust.getGender());
                customerRepository.save(customer);
                product1.setCustomer(customer);
                productRepository.save(product1);

            });
        }
        return productRepository.findAll();
    }

但我的问题是只有最后一个客户会被保存到名为 "BM" 的数据库中。和这样的回复一样。

[
    {
        "productName": "soap",
        "price": 100,
        "customer": {
            "custId": 5,
            "name": "BM",
            "email": "BM@gmail.com",
            "gender": "male"
        },
        "pqty": 0,
        "pid": 6
    }
]

我的目标是将每个客户保存到客户 table 并与 Person 映射。 我在这里错了什么?

谢谢。

您遇到了一些问题:

首先,在您的产品实体 bean 中定义一个客户列表 (List<Customer> customers)。然后使用 addCustomer 方法向其中添加客户。

也为每个客户使用自己的新客户对象,不要使用一个客户并更新值。

没有必要保存每个客户。保存产品 object/entity 应该就足够了。

提交和关闭事务时,这些值将保存到数据库中。 Spring 为您处理。

首先,将关系固定如下

@Data
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "product_id",updatable = false, nullable = false)
    private Long pId;
    private String productName;
    private int pQty;
    private int price;

    @OneToMany
    private List<Customer> customerList;
}

产品实体将变化如下

@数据

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "customer_id",updatable = false, nullable = false)
    private Long custId;

    private String name;
    private String email;
    private String gender;

    @ManyToOne
    private Product product;
}

然后如下更改您的saveProduct

@Override
public Iterable<Product> saveProduct(Product product) {
    Product product1 = new com.adl.dte.core.model.Product();
    product1.setProductName(product.getProductName());
    product1.setPQty(product.getPQty());
    product1.setPrice(product.getPrice());
    product1.setCustomerList(product.getCustomerList());

    product.getCustomerList().forEach(cust -> cust.setProduct(product1));
    productRepository.save(product);
    return productRepository.findAll();
}