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