@OneToMany Pesist Child при создании родительской сущности

У меня есть отношение OneToMany (от пользователя к адресу электронной почты)

Возможно, я делаю это неправильно, мой База данных пуста, но если я хочу отправить объект пользователя и добавить его в базу данных, вместе с объект emailAdresses и также сохранить адрес электронной почты.

Я хочу 2 записи в базе данных: 1 пользователь и 1 адрес электронной почты (с таблицей fk to user)

Класс обслуживания

В настоящее время я реализовал, чтобы заставить это работать:

@Service
public class UserService {

private UserRepository userRepository;
private ModelMapper modelMapper;

   public UserService(UserRepository userRepository, ModelMapper modelMapper) {
      this.userRepository = userRepository;
      this.modelMapper = modelMapper;

      //Used for mapping List
      modelMapper.getConfiguration()
              .setFieldMatchingEnabled(true)
              .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE)
              .setSourceNamingConvention(NamingConventions.JAVABEANS_MUTATOR);

  }
  public User createUser(UserCreateDTO userCreateDTO) {

      User user = modelMapper.map(userCreateDTO, User.class);
      //persist User to EmailAddress object
      if (user.getEmailAddresses() != null){
          user.getEmailAddresses().forEach(user::persistUser);
      }

      return userRepository.save(user);
  }

  public UserDTO getUserById(Long id) {
      User found = userRepository.findById(id).get();
      return modelMapper.map(found, UserDTO.class);
  }
  // .....

Который я видел в некоторых двунаправленных отношениях

Пользовательская сущность

@Entity
@Table(name = "Users")
@Getter @Setter @ToString @NoArgsConstructor
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "user_id", updatable = false, nullable = false)
   private Long id;

   private String firstName;
   private String lastName;
   private int age;

   @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
   private List<EmailAddress> emailAddresses;

Адрес электронной почты

@Entity
@Table(name = "Email")
@Getter @Setter @ToString @NoArgsConstructor
public class EmailAddress {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "email_id", updatable = false, nullable = false)
   private Long emailId;
   private String email;

   @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST )
   @JoinColumn(name = "user_id", nullable = false)
   @JsonIgnore
   private User user;

Есть ли лучший способ настроить отношения присоединения?

Пример POST-запроса

{"firstName":"Joe", "lastName":"Bloggs", "age": 30, "emailAddresses" : [ "[email protected]" , "[email protected]" ] }

вы сохраняете пользователя и извлекаете пользователя? Можете ли вы добавить класс обслуживания, в котором вы фактически вызываете entityManager или репозиторий Spring?

Peter Šály 05.03.2019 17:23

Я думаю, что этот вопрос близко к вашему.

pirho 05.03.2019 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
32
2

Ответы 2

Я думаю, вам нужно также связать это электронное письмо с пользователем, а не просто установить пользователя для электронной почты.

public void persistUser(EmailAddress emailAddress) {
    // set this email to the user
    // if email EmailAddresses list is null you might need to init it first
    this.getEmailAddresses().add(emailAddress);   
    emailAddress.setUser(this);
}

У меня тоже было это... но когда я выбирал пользователя по идентификатору. Он вернется с двумя элементами электронной почты... не уверен, почему это происходит. Кроме того, я вызываю этот метод только в том случае, если в запросе присутствует адрес электронной почты.

coding123 05.03.2019 17:08

Во-первых, я считаю, что метод persistUser не должен быть частью сервисного слоя — из-за своей реализации он в основном похож на метод Domain слоя, который должен быть реализован в User классе сущности. Во-вторых, поскольку это метод POST, вам не нужно заботиться о существовании писем — вы добавляете нового пользователя с новым набором писем. Ближе к вопросу, я бы предложил вам попробовать это:

public class UserService {

  /************/
  @Autowired
  private UserManager userManager;

  public void addUser(UserModel model) {
    User user = new User(model);
    List<EmailAddress> emails = model.getEmailAddresses().stream().map(EmailAddress::new).collect(Collectors.toList());
    user.setEmailAddresses(emails);
    userManager.saveUser(user);
  }  
}

и в User добавьте это:

public void setEmailAddresses(List<EmailAddress> emails) {
  emails.forEach(item -> item.setUser(this));
  this.emailAddresses = emails;
}

И не забудьте реализовать конструкторы для сущностей с параметрами модели.

Другие вопросы по теме