我使用的是OneToOne关系吗?

时间:2018-12-18 16:05:12

标签: java json spring spring-boot spring-framework-beans

您好,我实际上是在使用Spring-boot,hibernate,psql在REST服务器上工作,在实体之间添加OneToOne关系后遇到了一些困难。

这是2个实体:

付款:

@Entity
@Table(name = "pays")
public class Pays implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@JsonProperty("codePays")
private String codePays;

@Column(name = "libelle_pays")
@JsonProperty("libellePays")
private String libellePays;

@OneToOne(mappedBy = "pays",cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional=false)
private Traduction traduction;

protected Pays() {
}

public Pays(String codePays,String libellePays) {
    this.codePays = codePays;
    this.libellePays = libellePays;
}

和简介:

@Entity
@Table(name = "traduction")
public class Traduction implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonProperty("codeTrad")
private long codeTrad;

@Column(name = "defaultLanguage")
@JsonProperty("defaultLanguage")
private boolean defaultLanguage;

@OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name="fk_code_pays")
@JsonProperty("codePays")
private Pays pays;

public Traduction(){
}

public Traduction(String codePays,boolean defaultLanguage) {
    this.defaultLanguage = defaultLanguage;
    pays.setCodePays(codePays);
}

当我尝试使用Post方法填充表转换时,会发生我的问题:

@PostMapping("/traduction")
public Traduction createTraduction(@RequestBody Traduction trad) {
    System.err.println(trad);
    return repository.save(trad);
}

当我通过PostMan将JSON数据发送到服务器时,

  

{       “ codeTrad”:0,       “ defaultLanguage”:true,       “ fk_code_pays”:“ FR”       }

或这种方式:

  

{       “ codeTrad”:0,       “ defaultLanguage”:true,       “付款”:       {           “ codePays”:“ FR”,           “ libellePays”:“法国”       }   }

我的服务器似乎不了解与对象Pays的映射。 以下是我请求后的对象Traduction的外观: [codeTrad = 0,null,defaultLanguage = true]

和漂亮的错误:

  

已解决的[org.springframework.http.converter.HttpMessageNotWritableException:无法编写JSON :(为java.lang.NullPointerException);嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException :(是java.lang.NullPointerException)(通过参考链:com.auchan.corp.ipon.iponportail.model.Traduction [“ codePays”]))]

所以我想知道问题是来自服务器概念还是仅来自JSON。你有主意吗?

2 个答案:

答案 0 :(得分:0)

您的问题来自:

public Traduction(String codePays, boolean defaultLanguage) {
        this.defaultLanguage = defaultLanguage;
        pays.setCodePays(codePays)

pays为null,这就是为什么出现异常java.lang.NullPointerException的原因,请尝试将Pays pays添加到该构造函数。

答案 1 :(得分:0)

此json无法正常工作:

{ "codeTrad":0, "defaultLanguage":true, "fk_code_pays":"FR" }

因为您的fk_code_pays类中没有字段名Traduction

以下任何一项都不起作用:

{ "codeTrad":0, "defaultLanguage":true, "pays": { "codePays":"FR", "libellePays":"France" } }

因为付款用@JsonProperty("codePays")注释

根据您的DTO类,您的json应该是:

{ "codeTrad":0, "defaultLanguage":true, "codePays": { "codePays":"FR", "libellePays":"France" } }

我也建议您使用包装器类代替基元。 Boolean代替booleanLong代替long