创建父实体时@Onetomany pesist孩子



我有一个OneTomany关系(用户到emailaddress)

也许我以错误的方式进行操作,我的数据库是空的,但是如果我想发布一个用户对象并将其添加到数据库中,以及>emailadress对象并使电子邮件address也持续存在。

我想要数据库中的2个记录:1个用户和1个电子邮件address(带有FK到用户表)

服务类

目前我实施的工作是这样的:

@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;

有更好的方法来设置联接关系吗?

示例帖子请求

{"firstName":"Joe", "lastName":"Bloggs", "age": 30, "emailAddresses" : [ "joe-private@email.com" , "joe-work@email.com" ] }

我想您还需要将此电子邮件与用户相关联,而不仅仅是将用户设置为电子邮件实体。

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 Entity类中实现。其次,由于这是一种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;
}

,不要忘记使用模型对列者的实体实现构造函数

最新更新