Spring Data REST javax.persistence.RollbackException: ошибка при фиксации транзакции - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть буксировочные объекты:

@Data
@Entity(name = "users")
@NoArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
public User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id", unique = true, nullable = false)
    private Integer userId;

    private String userName;

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.REMOVE})
    @JoinColumn(name = "user_id")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Degree> degreeList;

}

и

@Data
@Entity(name = "degrees")
@NoArgsConstructor
@RequiredArgsConstructor
@EqualsAndHashCode
public Degree {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="id", unique = true, nullable = false)
    private Integer degreeId;

    private String degreeTitle;
}

Ресурсы:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRestRepository extends CrudRepository<User, Integer> {
}

, а затем:

@RepositoryRestResource(collectionResourceRel = "degrees", path = "degrees")
public interface DegreeRestRepository extends CrudRepository<Degree, Integer> {
}

Я должен добавить новый bar в barList foo, используя https://www.myhost.com/api/users/{userId}/degreeList конечную точку, как показано на рисунке:

enter image description here

, но я получаю :

{
    "timestamp": "2020-04-17T05:16:51.520+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction",
    "path": "/api/users/4/degreeList"
}

Я искал и обнаружил, что мне нужно сохранить Degree, а затем обновить degreeList. Как это сделать, пожалуйста, руководство

1 Ответ

2 голосов
/ 17 апреля 2020

Spring Data REST основан на URI (в соответствии с правилами HATEOAS). Если вы хотите добавить «градус» в «градусный список», вам действительно нужно сначала создать степень:

HTTP POST для https://www.myhost.com/api/degrees

Тело запроса имеет иметь тип контента application/json

После этого вы получите идентификатор степени в ответе. Этот идентификатор используется для добавления степени в список:

HTTP POST для https://www.myhost.com/api/users/{userId}/degreeList

Важно: на этот раз тип содержимого запроса text/uri-list! Тело должно быть простым текстом и должно содержать URI

https://www.myhost.com/api/degrees/{degreeId}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...