Может создавать ассоциации только с одной стороны в Spring Data Rest - PullRequest
0 голосов
/ 24 апреля 2020
@Entity
public class Product {
    //..
    private String name;

    @OneToMany(mappedBy = "product", orphanRemoval = true)
    private Set<File> files;
    //..
}

@Entity
public class File {
    //..
    @ManyToOne
    @JoinColumn(name = "product_id", nullable = true)
    Product product;
    //..
}

Я могу создать ассоциацию только с одной стороны, поэтому

POST /files/{id}
{    
    "product" : "http://localhost:8080/api/products/1"
}

работает, но

POST /products/{id}
{    
    "files" : [
        "http://localhost:8080/api/files/1"
        ]
}

не работает. POST не возвращает никакой ошибки, но связь не выполняется, и база данных не обновляет внешний ключ.

Согласно этому вопросу Разместите объект с Spring Data REST, который имеет отношения это должно работать, но это не так.


РЕДАКТИРОВАТЬ: Добавлена ​​дополнительная страница примера из https://www.baeldung.com/spring-data-rest-relationships

Даже на этой странице примера вы можете видеть, что ассоциация может быть когда-либо сделана только из "многих " сторона. В этом примере он установил связь между библиотеками <-> Книги один-ко-многим, и единственное, что вы можете сделать, это установить следующее:

curl -i -X PUT -H "Content-Type:text/uri-list"
-d "http://localhost:8080/libraries/1" http://localhost:8080/books/1/library

Вы не можете POST к http://localhost: 8080 / библиотеки / 1

1 Ответ

0 голосов
/ 24 апреля 2020

Полагаю, что двунаправленный один-ко-многим сейчас, к сожалению, не поддерживается SDR.

Я только что попытался использовать однонаправленный один-ко-многим, и он работает нормально :

Объекты:

@Entity
class Parent {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany
    private List<Child> children;
}

@Entity
public class Child {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
}

Запрос:

POST http://localhost:8080/parents
Content-Type: application/json

{
  "name": "parent1",
  "children": [
    "http://localhost:8080/children/1"
  ]
}

Результат:

insert into parent (name, id) values ('parent1', 2);
insert into parent_children (parent_id, children_id) values (2, 1);
...