Spring-boot JPA, сохраняющий реализацию «один ко многим» - PullRequest
0 голосов
/ 24 мая 2018

Поэтому я подумал, что у меня есть простое задание.Моя конечная точка REST берет JSON и сохраняет его.JSON состоит из двух сущностей: Задание, содержащее список событий:

{
"job_id": 123,
"otherid": "12344B",
"myID": "asdfgasdg234234",
"country_code": "DE",
"event": [
  {
    "sometime": "2018-04-21T15:45:59.999Z",
    "some_id": 1,
    "content": {
      "product": "B5",
      "pdf_link": "https://myhost.com/pdfFile.pdf"
      }
   }]
}

Это обрабатывается:

@Autowired
JobRepository jobRepo;

@PostMapping("/jobs")
public Job create(@RequestBody Job job) {
    return jobRepo.save(job);
}

Мой класс задания (опущен, надеюсь, я тоже не удалилмного):

import lombok.Getter;
import lombok.Setter;

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Job extends BaseDB{

    @Getter
    @Setter
    @Column(name="Job_ID")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonProperty("job_id")
    int jobID;

    @Getter
    @Setter
    @NotNull
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "job")
    @JsonProperty("event")
    List<Event> events;
}

И мой класс Event:

import lombok.Getter;
import lombok.Setter;

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Event extends BaseDB {

    @Getter
    @Setter
    @Column(name="Event_No")
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    int eventNo;

    @Getter
    @Setter
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "JOB_ID", nullable = false)
    @JsonIgnore
    Job job;
}

Репозитории определены так, но у меня нет логики, реализованной мной:

@Repository
public interface JobRepository extends CrudRepository<Job, Long>

@Repository
public interface EventRepository extends CrudRepository<Event, Long>

СейчасКогда я отправляю вышеупомянутый JSON в конечную точку /jobs, я получаю следующее сообщение об ошибке: ConstraintViolationImpl{interpolatedMessage="cannot be null", propertyPath=events, rootBeanClass=class com.my.model.Job, messageTemplate='{javax.validation.constraints.NotNull.message

Забавно, когда я смотрю на параметр job, который был проанализирован Jackson вмой метод create(), я фактически получаю список событий со значениями из JSON.Ошибка должна быть где-то при сохранении.

Я что-то забыл при определении OneToMany и ManyToOne?Или, возможно, мое понимание этой функциональности неверно, и я должен сохранить их отдельно?Первое задание, а затем события?

ОБНОВЛЕНИЕ

Итак, после удаления job_id из JSON Job сохраняется, но Event всписок все еще отсутствует.

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

{
"rowCreate": "2018-05-25T06:25:24.616+0000",
"rowModify": "2018-05-25T06:25:24.616+0000",
"rowActive": true,
"job_id": 12,
"otherid": "12344B",
"myID": "asdfgasdg234234",
"country_code": "DE",
"event": [
    {
        "rowCreate": null,
        "rowModify": null,
        "rowActive": true,
        "eventNo": 0,
        "content": "{product=B5, pdf_link=https://myhost.com/pdfFile.pdf}",
        "first": false,
        "last": false,
        "event_appearancetime": "2018-04-21T15:45:59.999+0000",
        "some_id": 1
    }
]

}

Как видите, параметры события заполняются значениями, которые должны бытьсохранились, но не все, как rowCreate и rowModify.Job с другой стороны, эти значения установлены.

В моем терминале Eclipse я вижу следующий вывод:

Hibernate: insert into jobs (row_active, row_create, row_modify, country_code, my_id, otherid) values (?, ?, ?, ?, ?, ?)
Hibernate: select last_insert_id()

Ничего о вставке в Event.

Чтобы иметь возможность работать, я добавил к своему create() методу:

Job newJob = jobRepo.save(job);
    List<Event> events = job.getEvents();

    for(Event event : events) {
        event.setJob(newJob);
        eventRepo.save(event);
    }

Но так ли я должен работать, или Hibernate должен делать это в фоновом режиме?

С уважением

...