Spring-boot JPA坚持一对多的反复

时间:2018-05-24 15:40:39

标签: java spring spring-boot jpa one-to-many

所以我认为我有一个简单的任务。我的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值的事件列表。错误必须在某个地方持续存在。

在定义OneToManyManyToOne时,我是否遗忘了某些内容? 或者也许我对这个功能的理解是错误的,我应该单独坚持它们?第一份工作,然后是事件?

更新

因此,从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
    }
]

}

正如您所看到的,事件参数填充了应该保留的值,但不是全部,例如rowCreaterowModify。另一方面,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本身应该在后台执行此操作?

亲切的问候

0 个答案:

没有答案