Используя Spring-Data-Rest, как обновить FK по обе стороны отношения OneToOne из одного вызова REST? - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть приложение Spring-Boot с

  • spring-boot-starter-data-rest
  • spring-boot-starter-data-jpa
  • h2

У меня есть сущности с взаимно-однозначным отношением, например:

@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long key;

    @OneToOne(cascade = ALL)
    @JoinColumn(name = "party")
    private Party party;

    @Column
    private String street;

    ....
}
@Entity
public class Party {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long key;

    @Column
    private String name;

    @OneToOne(cascade = ALL)
    @JoinColumn(name  = "address")
    private Address address;

    ...

}

И хранилища для каждой сущности:

@RepositoryRestResource
public interface AddressRepository extends JpaRepository<Address, Long> { }
@RepositoryRestResource
public interface PartyRepository extends JpaRepository<Party, Long> { }

Я создаю экземпляр каждой сущности:

curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{ "name": "John Smith" }' \
     http://localhost:8080/parties
curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{ "street": "456 main st" }' \
     http://localhost:8080/addresses

На экземпляре адреса я создаю ассоциацию HATEOAS для стороны:

curl -X PUT \
     -H 'Content-Type: text/uri-list' \
     -d http://localhost:8080/parties/1 \
     http://localhost:8080/addresses/1/party

Когда я проверяю ассоциацииадреса:

curl -X GET http://localhost:8080/addresses/1/party -i

Я вижу правильную сторону:

HTTP/1.1 200 
{
  "key" : 1,
  "name" : "John Smith",
  ....
}

Но, когда я проверяю ассоциации по адресу:

curl -X GET http://localhost:8080/parties/1/address -i

Не существует:

HTTP/1.1 404 

Как создать обе ассоциации из одного вызова с помощью Spring-Data-Rest?

1 Ответ

0 голосов
/ 10 ноября 2019

вам нужно выполнить свой скручивание, как показано ниже

curl -X POST \
     -H 'Content-Type: application/json' \
     -d '{ "name": "John Smith" , "address":{ "street": "456 main st" }}' \
     http://localhost:8080/parties

В Entity были внесены некоторые незначительные изменения

@Entity
public class Party implements Serializable{


    private static final long serialVersionUID = 1735292011581348691L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long key;

    @Column
    @JsonProperty("name")
    private String name;

    @JsonProperty("address")
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name  = "address")
    private Address address;


}

@Entity
public class Address implements Serializable {
private static final long serialVersionUID = -7468012139122259209L;


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long key;


    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "party")
    private Party party;

    @JsonProperty("street")
    @Column
    private String street;

}

Работает нормально, когда я тестировал. он сохраняет в обеих таблицах

curl, чтобы получить

curl -X  http://localhost:8080/parties/1
...