Как сохранить данные в новые строки в Spring Data JPA? - PullRequest
0 голосов
/ 18 января 2020

У меня есть 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
    }
]

Моя цель - сохранить каждого клиента в таблице клиентов и сопоставить его с персоной. Что я тут не так понял?

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 января 2020

Прежде всего, исправьте отношения следующим образом

@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;
}

Сущность продукта изменится, как показано ниже

@ 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;

    @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();
}
0 голосов
/ 18 января 2020

У вас есть некоторые проблемы:

Сначала определите список клиентов (List<Customer> customers) в компоненте сущности Product. Затем добавьте в него клиентов с помощью метода addCustomer.

Также используйте для каждого клиента собственный новый объект Customer и не используйте одного Customer и обновляйте значения.

Сохранять каждого клиента не обязательно. Сохранение объекта / объекта Product должно быть достаточно.

Значения сохраняются в базе данных, когда транзакция фиксируется и закрывается. Весна обрабатывает это для вас.

...