2017-01-05 3 views
0

Я пытаюсь добавить элемент в отношение @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> {} 
+0

Может быть проблемой Lombok. Попробуйте ручные сеттеры и геттеры –

+1

Это может быть связано с тем, что связь двунаправлена. Если вы делали это в коде, вам нужно было установить обе стороны отношения, чтобы каскад отношения был правильно. Можете ли вы попробовать удалить обратную ссылку из учетной записи для владельца, чтобы узнать, влияет ли это на результат? Если это подтвердит причину, см. Объяснение и возможные рабочие места здесь: http://stackoverflow.com/questions/30464782/how-to-maintain-bi-directional-relationships-with-spring-data-rest-and-jpa –

+0

Спасибо @AlanHay! Другой пост сделал трюк, решение немного странно, возможно, я смогу найти лучшее решение в будущем (если оно есть). Удаление двунаправленного варианта является вариантом для этого случая, но может быть не в другом будущем сценарии, и использование @ PreUpdate/@ PrePersist не кажется правильным, я не думаю, что мне нужно будет использовать это (оба решения работают) –

ответ

0

Попробуйте использовать что-то вроде этого тела в ваших сообщениях или PUT запросов/PATCH:

{ 
    // user properties... 
    "accounts": [ 
      "http://localhost:8080/accounts/1", 
      "http://localhost:8080/accounts/2" 
     ] 
} 

Для создания нового пользователя (с его счета) использовать запрос POST для http://localhost:8080/users

Для обновления текущего пользователя (и его учетные записи) используют запрос PUT/PATCH для http://localhost:8080/users/1 (1 - это идентификатор текущего пользователя)

+0

Спасибо за ваш ответ, я знаю, что ваше предложение работает, но это не входит в сферу моего вопроса. Я пытаюсь понять/использовать то, что вы можете найти в документации, связанной с вопросом –

+0

. Это не работает для меня с Spring Boot 1.5.2 и Spring Data REST 2.6.1 и полиморфизмом. –

Смежные вопросы