@OneToMany Pesist Child при создании родительского объекта - PullRequest
0 голосов
/ 05 марта 2019

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

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

Я хочу 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" : [ "joe-private@email.com" , "joe-work@email.com" ] }

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Во-первых, я считаю, что метод 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;
}

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

1 голос
/ 05 марта 2019

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...