У меня есть JSON, как это.
{
"productName":"soap",
"pQty":10,
"price" : 100,
"customerList":[
{
"name":"dasun",
"email":"lakmal@gmail.com",
"gender":"male"
},
{
"name":"BM",
"email":"BM@gmail.com",
"gender":"male"
}
]
}
Я хочу сохранить эти данные в две таблицы отдельных таблиц, называемые Product и Customer , которые имеют 1 ко многим отношениям так же, как и в 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;
}
My Rest Controller
@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
}
]
Моя цель - сохранить каждого клиента в таблице клиентов и сопоставить его с персоной. Что я тут не так понял?
Спасибо.