2017-04-11 68 views
1

應堅持一對多的關係我有一個叫jobprofile類,它包含以下一對多關係:在Spring數據休息

@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; 
    } 
} 

基本上,它只包含兩種對一種語言的引用,以及對它的熟練程度。

當我嘗試創建/保留作業配置文件時,只要嘗試將語言數據插入到數據庫中,就會失敗。

這是錯誤:

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException:

Could not write content: (was java.lang.NullPointerException) (through reference chain: org.springframework.data.rest.webmvc.json.["content"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: org.springframework.data.rest.webmvc.json.["content"])

我懷疑錯誤的根源在於JSON,因爲一對多關係完美的作品,當我手動插入數據。

的JSON的相關部分看起來是這樣的:

job_language_proficiency: Array[1] 
    0: Object 
     languages: "http://localhost:9000/api/languages/de" 
     proficiency_code: "http://localhost:9000/api/langproficiency/C1" 

任何想法,爲什麼這不起作用?

編輯:更新了JSON,以便它包含對象而不是鏈接。 enter image description here

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; } 
} 
+1

語言似乎是在您的映射中的對象,但它顯示爲您的JSON中的字符串。 – TheBakker

+0

您是否嘗試將兩個實體的ID更改爲Long。假設你需要一個'long'類型的id來支持Spring數據。 [鏈接](https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-rest-example/) –

+0

@TheBakker據我所知,使用鏈接也應該工作。在JSON中實現完整的對象對於這種特定的情況是非常不切實際的。 –

回答

1

你的JSON結構應該符合你的Java映射,否則你的對象不會被你的ORM持久化,這就是爲什麼你正在得到這樣的映射錯誤。

在你的實體的情況下,你有兩個實體,應該是object在你的JSON的關係:

@OneToOne 
private Languages languages; 

@OneToOne 
private LangProficiency langProficiency; 

但在你的JSON,您已設置這兩個對象作爲簡單的字符串:

languages: "http://localhost:9000/api/languages/de" 
proficiency_code: "http://localhost:9000/api/langproficiency/C1" 

他們應該匹配LanguageslangProficiency對象,proficiency_code應分別命名爲langProficiency喜歡你的Java屬性。

+0

感謝您的回答。 我嘗試了你的解決方案,將字符串值替換爲通過使用刪除的URL獲取請求來檢索的實際對象。(而且我也重命名了這個屬性) 我仍然很傷心地得到同樣的錯誤。 –

+0

你能修改你的問題嗎? –

+0

完成後,添加新的JSON並在其中包含對象 –

相關問題