所以我认为我有一个简单的任务。我的REST端点采用JSON并持久化。 JSON由两个实体组成:包含事件列表的Job:
{
"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;
}
我的活动课程:
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
时,我是否遗忘了某些内容?
或者也许我对这个功能的理解是错误的,我应该单独坚持它们?第一份工作,然后是事件?
更新
因此,从JSON中删除job_id
后,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本身应该在后台执行此操作?
亲切的问候