У меня есть отношение 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]" ] }
Я думаю, что этот вопрос близко к вашему.





Я думаю, вам нужно также связать это электронное письмо с пользователем, а не просто установить пользователя для электронной почты.
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);
}
У меня тоже было это... но когда я выбирал пользователя по идентификатору. Он вернется с двумя элементами электронной почты... не уверен, почему это происходит. Кроме того, я вызываю этот метод только в том случае, если в запросе присутствует адрес электронной почты.
Во-первых, я считаю, что метод 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;
}
И не забудьте реализовать конструкторы для сущностей с параметрами модели.
вы сохраняете пользователя и извлекаете пользователя? Можете ли вы добавить класс обслуживания, в котором вы фактически вызываете entityManager или репозиторий Spring?