[英]Persisting OneToMany Relation in Spring Data Rest
我有一个名为jobprofile的类,它包含以下OneToMany Relation:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "profile")
private List<JobLanguageProficiency> jobLanguageProficiency;
引用的类“JobLanguageProficiency”如下所示:
package ch.alv.jobmatch.entity.aux;
import ch.alv.jobmatch.entity.job.Jobprofile;
import javax.persistence.*;
@Entity
@Table(name = "job_language_proficiency")
public class JobLanguageProficiency {
@Id
private int id;
@ManyToOne
@JoinColumn(name = "jobprofile_jobprofile_id")
private Jobprofile profile;
@OneToOne
private Languages languages;
@OneToOne
private LangProficiency langProficiency;
public Languages getLanguages() {
return languages;
}
public void setLanguages(Languages languages) {
this.languages = languages;
}
public LangProficiency getLangProficiency() {
return langProficiency;
}
public void setLangProficiency(LangProficiency langProficiency) {
this.langProficiency = langProficiency;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Jobprofile getProfile() {
return profile;
}
public void setProfile(Jobprofile profile) {
this.profile = profile;
}
}
基本上,它只包含两种语言的引用,以及它的熟练程度。
当我尝试创建/持久化jobprofile时,它会在尝试在数据库中插入语言数据时失败。
这是错误:
无法写入HTTP消息:org.springframework.http.converter.HttpMessageNotWritableException:
无法写内容:(是java.lang.NullPointerException)(通过引用链:org.springframework.data.rest.webmvc.json。[“content”]); 嵌套异常是com.fasterxml.jackson.databind.JsonMappingException :(是java.lang.NullPointerException)(通过引用链:org.springframework.data.rest.webmvc.json。[“content”])
我怀疑错误的来源在于JSON,因为当我手动插入数据时,OneToMany Relation完美地工作。
JSON的相关部分如下所示:
job_language_proficiency: Array[1]
0: Object
languages: "http://localhost:9000/api/languages/de"
proficiency_code: "http://localhost:9000/api/langproficiency/C1"
任何想法为什么这不起作用?
LangProficiency实体:
package ch.alv.jobmatch.entity.aux;
import javax.persistence.*;
@Entity
@Table(name = "LangProficiency")
public class LangProficiency {
@Id
@Column(name = "proficiency_code")
private String proficiency_code;
private String description_de;
private String description_fr;
private String description_it;
private String description_en;
public String getProficiency_code() {
return proficiency_code;
}
public void setProficiency_code(String proficiency_code) {
this.proficiency_code = proficiency_code;
}
public String getDescription_de() {
return description_de;
}
public void setDescription_de(String description_de) {
this.description_de = description_de;
}
public String getDescription_fr() {
return description_fr;
}
public void setDescription_fr(String description_fr) {
this.description_fr = description_fr;
}
public String getDescription_it() {
return description_it;
}
public void setDescription_it(String description_it) {
this.description_it = description_it;
}
public String getDescription_en() { return description_en; }
public void setDescription_en(String description_en) { this.description_en = description_en; }
}
语言实体:
package ch.alv.jobmatch.entity.aux;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "Languages")
public class Languages implements Serializable {
@Id
@Column(name = "languages")
private String languages;
private String description_de;
private String description_fr;
private String description_it;
private String description_en;
public String getLanguages() {
return languages;
}
public void setLanguages(String languages) {
this.languages = languages;
}
public String getDescription_de() {
return description_de;
}
public void setDescription_de(String description_de) {
this.description_de = description_de;
}
public String getDescription_fr() {
return description_fr;
}
public void setDescription_fr(String description_fr) {
this.description_fr = description_fr;
}
public String getDescription_it() {
return description_it;
}
public void setDescription_it(String description_it) {
this.description_it = description_it;
}
public String getDescription_en() { return description_en; }
public void setDescription_en(String description_en) { this.description_en = description_en; }
}
您的JSON结构应与您的Java Mapping匹配,否则您的ORM将不会保留您的对象,这就是您获得此类映射错误的原因。
在您的实体中,您与两个实体有关系,这两个实体应该是JSON中的object
:
@OneToOne
private Languages languages;
@OneToOne
private LangProficiency langProficiency;
但是在您的JSON中,您已将这两个对象设置为简单字符串:
languages: "http://localhost:9000/api/languages/de"
proficiency_code: "http://localhost:9000/api/langproficiency/C1"
它们应该匹配Languages
和langProficiency
对象, proficiency_code
应该像您的Java属性一样分别命名为langProficiency
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.