我有一个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;
}
,不要忘记使用模型对列者的实体实现构造函数