Я пытаюсь добавить элемент в отношение @OneToMany после этого tutorial в Spring Data Rest, я использую следующий запрос, чтобы добавить учетную запись в коллекцию учетных записей пользователей.Spring data rest добавить элемент в коллекцию
curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/account/1" http://localhost:8080/user/1/accounts
Запрос отвечает 204, и при проверке списка учетных записей пользователей ничего не меняется. Отладка приложения я вижу, что объект сохраняется, поэтому, возможно, транзакционная фиксация не происходит. Я также заметил, что если я изменил отношение к @OneToOne, запрос будет работать, как ожидалось.
класс пользователя
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "accounts")
@EqualsAndHashCode(of = "id", callSuper = false)
@SequenceGenerator(name = "user_sq", sequenceName = "user_sq")
public final class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "user_sq")
private Long id;
//other properties
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
private List<Account> accounts;
// @OneToOne(cascade = CascadeType.ALL)
// private Account accounts;
}
класса Account
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id", callSuper = false)
@SequenceGenerator(name = "account_sq", sequenceName = "account_sq")
public final class Account extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "account_sq")
private Long id;
//other properties
@ManyToOne
private User owner;
}
Хранилища
@RepositoryRestResource(collectionResourceRel = "accounts", path = "account")
public interface AccountRepository extends PagingAndSortingRepository<Account, Long> {}
@RepositoryRestResource(collectionResourceRel = "users", path = "user")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {}
Может быть проблемой Lombok. Попробуйте ручные сеттеры и геттеры –
Это может быть связано с тем, что связь двунаправлена. Если вы делали это в коде, вам нужно было установить обе стороны отношения, чтобы каскад отношения был правильно. Можете ли вы попробовать удалить обратную ссылку из учетной записи для владельца, чтобы узнать, влияет ли это на результат? Если это подтвердит причину, см. Объяснение и возможные рабочие места здесь: http://stackoverflow.com/questions/30464782/how-to-maintain-bi-directional-relationships-with-spring-data-rest-and-jpa –
Спасибо @AlanHay! Другой пост сделал трюк, решение немного странно, возможно, я смогу найти лучшее решение в будущем (если оно есть). Удаление двунаправленного варианта является вариантом для этого случая, но может быть не в другом будущем сценарии, и использование @ PreUpdate/@ PrePersist не кажется правильным, я не думаю, что мне нужно будет использовать это (оба решения работают) –