我正在尝试做一个简单的Spring应用程序。它需要公开REST端点并将其保存到关系数据库中。
我接受了您的示例项目http://spring.io/guides/gs/accessing-data-
rest/
。如您的指南中所述,我能够执行所有操作(POST,PATCH,PUT,GET)。
但是,我尝试为Person Entity类添加关系,事情开始崩溃。
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstName;
private String lastName;
@OneToOne(cascade = {CascadeType.ALL})
private PersonDetails personDetails;
@OneToOne(cascade = {CascadeType.ALL})
private PersonChildren personChildren;
///Getter and setters for everything except id.
}
@Entity
public class PersonChildren {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String childFirstName;
private String childLastName;
@OneToOne(mappedBy="personChildren", optional=false)
private Person person;
///Getter and setters for everything except id.
}
@Entity
public class PersonDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String email;
private String phoneNumber;
@OneToOne(mappedBy="personDetails",optional=false)
private Person person;
///Getter and setters for everything except id.
}
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
List<Person> findByLastName(@Param("name") String name);
}
build.gradle
buildscript {
repositories {
maven { url "http://repo.spring.io/libs-release" }
mavenLocal()
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.1.RELEASE")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
jar {
baseName = 'gs-accessing-data-rest'
version = '0.1.0'
}
repositories {
mavenLocal()
mavenCentral()
maven { url "http://repo.spring.io/libs-release" }
}
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
compile("com.h2database:h2")
compile("org.springframework.data:spring-data-rest-webmvc")
}
task wrapper(type: Wrapper) {
gradleVersion = '1.11'
}
呼叫:
$ curl -i -X POST -H "Content-Type:application/json" -d '{ "firstName":"John", "lastName": "Doe", "personDetails": { "email": "john@gmail.com", "phoneNumber": "001-002-0003" }, "personChildren": {"childFirstName": "Mary", "childLastName": "Martin" } }' <code> http://localhost:8080/people </code>
Response:
HTTP/1.1 201 Created
Server: Apache-Coyote/1.1
<code>
Location: http://localhost:8080/people/1
</code>
Content-Length: 0
Date: Thu, 26 Jun 2014 05:42:45 GMT
$ curl http://localhost:8080/people
{
"timestamp" : 1403761371011,
"status" : 500,
"error" : "Internal Server Error",
"exception" : "org.springframework.http.converter.HttpMessageNotWritableException",
"message" : "Could not write JSON: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.OneToOne(optional=false, targetEntity=void, cascade=[], fetch=EAGER, orphanRemoval=false, mappedBy=personChildren) private com.ds.dao.rest.Person com.ds.dao.rest.PersonChildren.person using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]->java.util.UnmodifiableMap[\"people\"]->java.util.ArrayList[0]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Detected multiple association links with same relation type! Disambiguate association @javax.persistence.OneToOne(optional=false, targetEntity=void, cascade=[], fetch=EAGER, orphanRemoval=false, mappedBy=personChildren) private com.ds.dao.rest.Person com.ds.dao.rest.PersonChildren.person using @RestResource! (through reference chain: org.springframework.hateoas.PagedResources[\"_embedded\"]->java.util.UnmodifiableMap[\"people\"]->java.util.ArrayList[0])",
"path" : "/people"
}
问题1:我可以发表文章,但我的GET一直失败。
问题2:发布成功后,为什么会出现此错误?
问题3:是否有很好的Spring指南对REST和JPA有帮助?如果您仍在使用这些模块,我可以看什么示例?
问题4:@RepositoryRestResource是问题吗?除非我添加spring-data-rest-webmvc作为依赖项,否则无法识别。
这类似于未回答的问题, Spring Data
Rest歧义关联异常
更新 :
它仅OneToOne
在Person
类中使用一个映射。如果我想补充的两个类,personDetails
并personChildren
在Person
与OneToOne
映射。它不起作用。
我也尝试添加@JointColumn(name="person_details")
和@JointColumn(name="person_children")
以personDetails
和personChildren
。它也不起作用。
这样做的原因很简单:关联实体的关系名称是从包含类的属性名称派生的。因此,无论PersonDetails
并且PersonChildren
要创建出站链接到一个Person
名为person
。如果我们渲染的话,看起来会像这样
{ _links : {
person : { href : … }, <- the one from PersonDetails
person : { href : … } <- the one from PersonChildren
}
这当然是无效的。而且,将两个链接排列在一个数组中将使您无法再区分两个链接(哪个来自PersonDetails
哪个链接,哪个来自哪个链接PersonChildren
。)。
因此,这里有一些选择:
Person
属性,@RestResource
并将注释的属性配置为rel
以外的其他值person
。exported
标志设置@RestResource
为false
,链接将不会呈现。如果例如from的指针PersonDetails
仅在代码内相关,而实际上不在JSON表示中,则这可能很有用。我正在尝试做一个简单的Spring应用程序。它需要公开RESTendpoint并将其保存到关系数据库中。 我拿了你的样本项目,http://spring.io/guides/gs/accessing-data-rest/.我能够完成您指南中提到的所有操作(POST、PATCH、PUT、GET)。 然而,我试着在Person-Entity类中添加关系,结果开始崩溃。 电话: 问题1:我能写一篇文章,
关于这个问题,我检查了Spring Data Rest Ambiguous Association Exception,但无法让它为我工作。 正如您在下面的代码中看到的,我添加了注释,其中等于其他值。 与上面的问题类似,POST请求起作用,但GET请求引发关于具有相同关系类型的多个关联链接的异常: “无法写入JSON:检测到多个具有相同关系类型的关联链接!DisambiguateAssociati
问题内容: 有一个实体类“ A”。A类可能具有相同类型“ A”的子级。如果“ A”是孩子,则也应保留它的父母。 这可能吗?如果是这样,我应该如何在Entity类中映射关系?[“ A”有一个id列。] 问题答案: 是的,这是可能的。这是标准双向@ManyToOne/ @OneToMany关系的特例。之所以特别是因为关系两端的实体都是相同的。JPA 2.0规范的第2.10.2节详细介绍了一般情况。 这
问题内容: 我有以下查询。它工作正常,但我需要从另一个名为FB的表中提取BUserName,该表具有与FU表中的UserID相关的UserID字段。这可能吗? 只是为了澄清。我在FB表中没有UserName列。它确实有FB.UserID,它与FF.UserID有关系,这是我要从中提取第二个UserName的地方。因此,通过这种关系,我试图从与FB表中的userID相关的FF.UserID表中拉出用
我使用下面的代码创建了20篇帖子,每个帖子都有3条评论。 相反,我想创建20个帖子,每个帖子都有随机数量的评论(例如,帖子1有2个评论,帖子2有4个评论,等等)。) 这不起作用,每个帖子都有相同(随机)数量的评论。 我怎样才能做到这一点?
我需要支持一个涉及以下实体的场景(使用JPA): 用户 一个用户可以有多个帐户,一个帐户可以在多个用户之间共享,这是迄今为止的标准@ManyToMany关系。 一个用户可以为每个帐户拥有一组不同的角色,一个角色可以在多个用户之间共享。 我遵循了这个实践,它解释了一种用额外列映射多对多关联的方法,但我不确定我是否得到了它。 用户实体: 账户实体: 用户帐户实体: 用户帐号: 我正在创建一个新用户并尝