繁体   English   中英

SPRING DATA JPA保存@OneToMany关系

[英]SPRING DATA JPA save @OneToMany relation

我尝试将父实体与一对多关系持久化:

@Entity
public class TrainEx  {
    private Set<TrainCompositionEx> trainCompositionsByTrainId;
    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY,  mappedBy = "trainByTrainId")
    public Set<TrainCompositionEx> getTrainCompositionsByTrainId() {
        return trainCompositionsByTrainId;
    }

    public void setTrainCompositionsByTrainId(Set<TrainCompositionEx> trainCompositionsByTrainId) {
        this.trainCompositionsByTrainId = trainCompositionsByTrainId;
    }
...
}

和子实体:

@Entity
public class TrainCompositionEx{
    @Id
    @ManyToOne(cascade = {CascadeType.REFRESH}, fetch = FetchType.LAZY)
    @JoinColumn(name = "trainId", referencedColumnName = "trainId", nullable = false, insertable = true, updatable = true)
    private TrainEx trainByTrainId;
....

}

所以我从json POST端点接收了我的TrainEx trainEx:

 @RequestMapping(method= RequestMethod.POST, consumes = "application/json", produces = "application/json")
    public @ResponseBody
    ResponseEntity<Void> addTrain(@RequestBody TrainEx trainEx) throws Exception {
        trainService.add(trainEx);
        return new ResponseEntity<Void>(HttpStatus.CREATED);
    }

JSON:

 {
    "trainId" : 5,
    "status" :  1,
    "maxWeight" :  200,
    "maxLength" :  35,
    "speed" :  60,
    "totalWeight" : 100,
    "totalLength" : 20,
    "trainCompositionsByTrainId": [{
        "wagonByWagonId": {"wagonId" : 2}
    }]
 } 

在我保存之后:

...
@Transactional
    public TrainEx add(TrainEx trainEx) {

    for(TrainCompositionEx trainCompositionEx : trainEx.getTrainCompositionsByTrainId()){
        trainCompositionEx.setTrainByTrainId(trainEx);
        trainCompositionEx.setWagonByWagonId(
                em.getReference(WagonEx.class, trainCompositionEx.getWagonByWagonId().getWagonId()));
    }
    return trainExRepository.save(trainEx);
    }
    ...

但是我收到了SQL ERROR:列“trainid”中的null值违反了非空约束 ,但是如你所见,我将trainEx实体设置为TrainCompositionEx ,并且我在调试模式中停止并且trainId存在于那里: 在此输入图像描述 所以我该怎么做?

UPDATE1:我调查日志,并认为在这个问题孩子的家长实体之前坚持,因为我插入train_composition表,但不进火车表中看到:

Hibernate: insert into tms.public.train_composition (version, transportOrderId, wagonId, trainId) values (?, ?, ?, ?)

我使用em.persist来持久化类。 我的父母实体有

@JsonProperty(TIMES)
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<Times> timesList = new HashSet<Times>();

而孩子有

@JsonIgnore
@ManyToOne(cascade = CascadeType.ALL)
private Rider rider;

代码是

em.persist(rider);
for (Times t : rider.getTimes()) {
    t.setRider(rider);
}

对于新骑手,对于现有骑手,我将新数据合并到旧对象中。 该项目在此处: https//github.com/xtien/motogymkhana-server该代码来自RiderDaoImplRider and Times 这就是该项目的用途: http//www.gymcomp.com/eu

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM