Я пытаюсь сохранить объект «Пользователь», связанный отношением OneToMany, с объектом «Волонтер».
Когда я пытаюсь сохранить его, он работает только тогда, когда я предоставляю основные идентификаторы дляоба эти объекты.Однако мне нужно сохранить объект и позволить базе данных диктовать идентификаторы через autoIncrement.Я не уверен, как мне это сделать или даже если это возможно.
Json Mapping, который работает:
{
"id":8,
"userName": "user8",
"password": "pass1234",
"volunteersId": 6,
"volunteers": [{
"id":6,
"committeesId": 2,
"outreachDate": "2019-12-07",
"usersId": 8
}]
}
Json Mapping, который мне нужен (но не будет работать):
{
"userName": "user8",
"password": "pass1234",
"volunteersId": 6,
"volunteers": [{
"committeesId": 2,
"outreachDate": "2019-12-07",
}]
}
Так что я думаю, может быть, есть способ подключить внешние ключи, чтобы мне не пришлось явно добавлять идентификаторы autoIncrement (usersId, добровольцы).
Контроллер пользователя:
@Controller
public class UserController {
@RequestMapping(value = "/v1/users", method = RequestMethod.POST)
public ResponseEntity<Object> saveUsers( @RequestBody UserEntity request){
try {
return ResponseEntity.ok(userService.saveUser(request));
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
}
Служба пользователя:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public Page<UserEntity> saveUser(UserEntity user){
userRepository.save(user);
Pageable pageable = PageRequest.of(0, 10, Sort.by("id").descending());
return userRepository.findAll(pageable);
}
}
Репозиторий пользователя:
public interface UserRepository extends JpaRepository<UserEntity, Long> {
public List<UserEntity> findAllByOrderByIdAsc();
public List<UserEntity> findAllByOrderByIdDesc();
public Page<UserEntity> findByUserNameContaining(String userName, Pageable pageable);
}
Объект пользователя:
@Entity
@Table(name = "users")
public class UserEntity {
@Id
private long id;
@Column(name = "username")
private String userName;
private String password;
@Column(name = "volunteers_id", nullable = true)
private Long volunteersId;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "users_id")
private List<VolunteerEntity> volunteers = new ArrayList<>();
// omitted getters and setters
}
Участник добровольцев:
@Entity
@Table(name = "volunteers")
public class VolunteerEntity {
@Id
private long id;
@Column(name = "committees_id")
private long committeesId;
@Column(name = "outreach_date")
private Date outreachDate;
@Column(name = "users_id")
private Long usersId;
// omitted getters and setters
}
Есть идеи или предложения, как спасти всю эту сущность?Я задаюсь вопросом, действительно ли это возможно сохранить как в одном целом процессе.Хотя, если нет, я думаю просто сохранить их независимо (сначала информация о пользователе, затем - волонтер), но на всякий случай это будет действительно полезно