Как сохранить сущность с отношением OneToMany, используя автоматически увеличенные идентификаторы, которые связаны - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь сохранить объект «Пользователь», связанный отношением 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
}

Есть идеи или предложения, как спасти всю эту сущность?Я задаюсь вопросом, действительно ли это возможно сохранить как в одном целом процессе.Хотя, если нет, я думаю просто сохранить их независимо (сначала информация о пользователе, затем - волонтер), но на всякий случай это будет действительно полезно

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Это сделает генерацию основного идентификатора автоматической

@Entity
@Table(name = "user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

0 голосов
/ 30 мая 2019

Вам необходимо добавить аннотацию @GeneratedValue рядом с @ id

@Id
@GeneratedValue(strategy = GenerationType.selectOne)
private long id;

В случае последовательности необходимо добавить дополнительную аннотацию

@Id
@SequenceGenerator(name = "customName", sequenceName = "sequenceNameInDatabase")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="customName")
private long id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...