У меня есть простая проблема - но я думаю: «Я стою на трубе».
У меня есть api с пружинной загрузкой с JPA, Modelmapper, Entities и DTO.
Но отображение не работает.
Объекты:
@Getter
@Setter
@MappedSuperclass
public class AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
@Getter
@Setter
@Entity(name = "contacts")
public class Contact extends AbstractEntity {
@NotBlank
private String firstName;
@NotBlank
private String lastName;
@Valid
@OneToMany(mappedBy = "contact", cascade = CascadeType.ALL, orphanRemoval = true)
private List<PhoneNumber> phoneNumberList;
}
@Getter
@Setter
@Entity(name = "phone_numbers")
public class PhoneNumber extends AbstractEntity {
@NotBlank
private String label;
@NotBlank
private String number;
@ManyToOne
@JoinColumn(name = "contact_id", referencedColumnName = "id")
@Setter(value = AccessLevel.NONE)
private Contact contact;
}
DTO:
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ContactDTO {
private Long id;
private String firstName;
private String lastName;
List<PhoneNumberDTO> phoneNumberDTOList = new ArrayList<>();
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PhoneNumberDTO {
private Long id;
private String label;
private String number;
}
Мой ModelMapperConfig:
@Bean
public ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(AccessLevel.PRIVATE);
return modelMapper;
}
Repo:
public interface ContactRepository extends JpaRepository<Contact, Long{
}
Сервис (только метод создания):
@Override
public ContactDTO createOne(ContactDTO contactDTO) {
Contact contact = modelMapper.map(contactDTO, Contact.class);
contactRepository.save(contact);
return contactDTO;
}
Это правильный способ сохранить контакт с несколькими телефонными номерами?
А как мне создать простое сопоставление?
Если я хочу сохранить его, появляется ошибка:
Column 'contact_id' cannot be null