Я правильно использую отношения OneToOne? - PullRequest
0 голосов
/ 18 декабря 2018

Здравствуйте. На самом деле я работаю на REST-сервере с использованием Spring-boot, hibernate, psql и испытываю некоторые трудности после добавления отношения 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;
}

и Traduction:

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

когда я отправляю данные JSON на мой сервер через PostMan следующим образом:

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

или так:

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

Мой сервер, похоже, не понимает сопоставление с объектом Pays.Вот как выглядит объект Traduction после моего запроса: [codeTrad = 0, null, defaultLanguage = true]

и милая ошибка:

Resolved [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 голосов
/ 18 декабря 2018

Этот json не будет работать:

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

, поскольку в вашем классе Traduction нет имени поля fk_code_pays.

Ниже также не будет работать:

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

Поскольку pays помечен @JsonProperty("codePays")

В соответствии с вашими классами DTO, ваш json должен быть:

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

Также я бы порекомендовал вам использовать классы-оболочкивместо примитивов.Boolean вместо boolean и Long вместо long.

0 голосов
/ 18 декабря 2018

Ваша проблема связана с:

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

Платежи равны нулю, и поэтому вы получаете исключение: java.lang.NullPointerException, попробуйте добавить платит Pays в этот конструктор.

...