Поэтому я подумал, что у меня есть простое задание.Моя конечная точка 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 должен делать это в фоновом режиме?
С уважением