Как добавить запись в таблицу базы данных для комбинации двух таблиц - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть User и Customer классы, которые работают с отношениями @OneToOne. Соответственно, Customer имеет POST-method, при выполнении я создаю запись в таблице user, а затем в таблице customer. Я не знаю, как соединить их в таблице, то есть в таблице customer в поле user_id, я не знаю, как поместить id только что созданного user?

Все User поля принадлежат также Customer.

Я использую Spring-MVC + Hibernate + Jpa + PostgreSQL.

Это мой первый большой проект с Spring.

Пользователь:

package com.tinychiefdelights.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.persistence.*;

@ApiModel
@Data
@Entity
@Table(name = "pg_user", schema = "public")
public class User {

    public User() { // Пустой конструктор для Hibernate

    }

    public User(String name, String lastName, String role,
                String login, String password) { // Базовый конструктор

        this.name = name;
        this.lastName = lastName;
        this.role = role;
        this.login = login;
        this.password = password;
    }


    // Поля
    private @Id
    @GeneratedValue
    Long id;

    @Column(name = "login")
    private String login;

    @Column(name = "password")
    private String password;

    @Column(name = "role")
    private String role;

    @Column(name = "name")
    private String name;

    @Column(name = "last_name")
    private String lastName;
}

Заказчик:

package com.tinychiefdelights.model;

import com.fasterxml.jackson.annotation.*;
import com.tinychiefdelights.repository.CustomerRepository;
import lombok.Data;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import javax.persistence.*;
import java.util.List;

@Data
@Entity
@Table(name = "customer", schema = "public")
public class Customer {

    public Customer() { // Пустой конструктор для Hibernate

    }


    // Поля

    // name, lastName, login, password берем от класса User через связи;

    private @Id
    @GeneratedValue
    Long id;

    @Column(name = "wallet")
    private double wallet;


    //Relationships
    //
    @OneToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id") // Join without Customer in User class
    @NotFound(action = NotFoundAction.IGNORE)
    private User user;

    //Лист заказов
    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
    @JsonIgnore // Таким образом я предотвратил рекурсию
    private List<Order> orderList;
}

Отдел обслуживания клиентов:

package com.tinychiefdelights.service;

import com.tinychiefdelights.model.Customer;
import com.tinychiefdelights.model.User;
import com.tinychiefdelights.repository.CustomerRepository;
import com.tinychiefdelights.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class CustomerService extends UserService {


    private CustomerRepository customerRepository;

    private UserRepository userRepository;


    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Autowired
    public void setCustomerRepository(CustomerRepository customerRepository) {
        this.customerRepository = customerRepository;
    }



    // Методы
    //
    public Customer addCustomer(User newUser, Customer newCustomer){
        userRepository.save(newUser);
        return customerRepository.save(newCustomer);
    }

Контроллер клиента:

package com.tinychiefdelights.controller;

import com.tinychiefdelights.exceptions.NotFoundException;
import com.tinychiefdelights.model.Customer;
import com.tinychiefdelights.model.User;
import com.tinychiefdelights.repository.CustomerRepository;
import com.tinychiefdelights.service.CustomerService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(value = "Работа с Заказчиком", tags = {"Заказчик"})
@RestController
public class CustomerController {

    //Constructor
    //
    @Autowired
    public CustomerController(CustomerRepository customerRepository, CustomerService customerService) {
        this.customerRepository = customerRepository;
        this.customerService = customerService;
    }


    // Fields
    //Injects into constructor
    //
    private final CustomerRepository customerRepository;

    private CustomerService customerService;



    // Aggregate Root
    @GetMapping("/customers")
    List<Customer> all(){
        return customerRepository.findByUserRole("customer");
    }

    @PostMapping("/customers")
    Customer addCustomer(User newUser, @RequestBody Customer newCustomer){
        return customerService.addCustomer(newUser, newCustomer);
    }

enter image description here

enter image description here

enter image description here

1 Ответ

1 голос
/ 25 апреля 2020

Вам необходимо синхронизировать связь между сущностями:

public Customer addCustomer(User newUser, Customer newCustomer) {
    newCustomer.setUser(newUser);
    return customerRepository.save(newCustomer);
}

и каскадно вносить изменения в User:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@NotFound(action = NotFoundAction.IGNORE)
private User user;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...