【发布时间】:2020-03-06 03:20:38
【问题描述】:
我有一个 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 从一次调用中创建两个关联?
【问题讨论】:
-
你能告诉我们你在聚会中保存的java代码吗
-
就在上面,保存由 JpaRepository 代理并作为 POST 公开。
-
它不存在,实际上,我想看看你在哪里调用repository.save,我怀疑你保存聚会时没有填充地址,理想情况下,当你保存聚会地址时也应该保存
-
除了@SpringBootApplication 类有一个main 方法,这是整个应用程序(减去getter/setter)。无需手动调用 repository.save —— 这是由 spring-data-rest 自动代理到 REST 端点的。
-
好的,刚刚意识到你在使用@RepositoryRestResource,以为你在使用@Repository
标签: java spring-boot spring-data-jpa spring-data-rest spring-hateoas